#include <iostream>
#include <vector>

using namespace std;

const int N = (int) 1e6 + 5;

bool judge(long long diff[], int n,const vector<vector<int> >& orders, int m) {
	long long* diff2 = new long long[n + 2];
	copy(diff, diff + n + 2, diff2);
	for (int i = 1; i <= m; i++) {
		diff2[orders[i][1]] += -orders[i][0];
		diff2[orders[i][2] + 1] -= -orders[i][0];
	}
	long long sum = 0;
	for (int i = 1; i <= n; i++) {
		sum += diff2[i];
		if (sum < 0) return false;	
	}
	return true;
}

int main() {
	int n, m;
	cin >> n >> m;
	int* a = new int[n + 1];
  	//注意精度
	long long* diff = new long long[n + 2];
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		diff[i] = i > 1 ? a[i] - a[i - 1] : a[i]; 
	}
  	//直接使用栈存储数组会stackoverflow
	vector<vector<int> > orders(m + 1, vector<int>(3)); 
	for (int i = 1; i <= m; i++) {
		cin >> orders[i][0] >> orders[i][1] >> orders[i][2];
	}
	if (judge(diff, n, orders, m)) {
		cout << 0 << endl;
	} else{
		int l = 1, r = m;
		while (r > l) {
			int mid = (r - l) / 2 + l;
			if (judge(diff, n, orders, mid)) l = mid + 1;
			else r = mid; 
		}
		cout << l << endl;	
	} 
}