import bisect def main(): import sys input = sys.stdin.read data = input().split() ptr = 0 N = int(data[ptr]) ptr += 1 M = int(data[ptr]) ptr += 1 X = int(data[ptr]) ptr += 1 C = list(map(int, data[ptr:ptr+N])) ptr += N # Convert C to 1-based index C = [0] + C sumY = dict() for _ in range(M): A_j = int(data[ptr]) ptr += 1 B_j = int(data[ptr]) ptr += 1 Y_j = int(data[ptr]) ptr += 1 key = (A_j, B_j) if key not in sumY: sumY[key] = 0 sumY[key] += Y_j # Preprocess for each B, the list of i's where C_i = B from collections import defaultdict pos = defaultdict(list) for i in range(1, N+1): b = C[i] pos[b].append(i) # Sort the lists for binary search for b in pos: pos[b].sort() delta = [0] * (N + 1) for (A, B), y in sumY.items(): if B not in pos: continue lst = pos[B] idx = bisect.bisect_left(lst, A) for i in lst[idx:]: k = i - A if 0 <= k <= N: delta[k] += y max_score = 0 for k in range(0, N+1): score = X * k + delta[k] if score > max_score: max_score = score print(max_score) if __name__ == "__main__": main()