#include <bits/stdc++.h>
using namespace std;
const long long int N = 2e5 + 2, inf = 1e9 + 7;
void _run();
void no() { cout << "-1\n", exit(0); }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  _run();
  return 0;
}
long long int n, A[N], T[4 * N], lz[4 * N];
vector<pair<int, int> > vec[N];
void push_down(int nod, int st, int ed, long long int vl) {
  T[nod] += vl;
  if (st != ed) {
    lz[2 * nod] += vl;
    lz[2 * nod + 1] += vl;
  }
  lz[nod] = 0;
}
void build(int nd, int lo, int hi) {
  if (lo == hi) {
    T[nd] = A[lo];
    return;
  }
  int md = (lo + hi) >> 1;
  build(2 * nd, lo, md);
  build(2 * nd + 1, md + 1, hi);
  T[nd] = T[2 * nd] + T[2 * nd + 1];
}
void updt(int nod, int st, int ed, int l, int r, long long int vl) {
  if (lz[nod]) push_down(nod, st, ed, lz[nod]);
  if (st > ed || st > r || ed < l) return;
  if (st >= l && ed <= r) {
    T[nod] += vl;
    if (st != ed) {
      lz[2 * nod] += vl;
      lz[2 * nod + 1] += vl;
    }
    return;
  }
  int md = (st + ed) >> 1;
  updt(2 * nod, st, md, l, r, vl);
  updt(2 * nod + 1, md + 1, ed, l, r, vl);
  T[nod] = max(T[2 * nod], T[2 * nod + 1]);
}
long long int qry(int nod, int st, int ed, int l, int r) {
  if (st > ed || st > r || ed < l) return 0;
  if (lz[nod]) push_down(nod, st, ed, lz[nod]);
  if (st >= l && ed <= r) return T[nod];
  int md = (st + ed) >> 1;
  return max(qry(2 * nod, st, md, l, r), qry(2 * nod + 1, md + 1, ed, l, r));
}
void _run() {
  int q;
  cin >> n >> q;
  for (int i = 1; i <= n; i++) cin >> A[i];
  long long int rs = 0;
  while (q--) {
    int l, r, p;
    cin >> l >> r >> p;
    vec[r].push_back(make_pair(l, p));
  }
  for (int i = 1; i <= n; i++) {
    updt(1, 0, n, 0, i - 1, -A[i]);
    for (auto x : vec[i]) {
      int l = x.first, p = x.second;
      updt(1, 0, n, 0, l - 1, p);
    }
    long long int rt = qry(1, 0, n, 0, i - 1);
    rs = max(rs, rt);
    updt(1, 0, n, i, i, rs);
  }
  cout << rs << "\n";
}
