#include <bits/stdc++.h>
using namespace std;
int n, m, a[200001];
long long ans, b[200001], mn;
pair<pair<int, int>, long long> ed[200001];
vector<pair<int, long long> > e[200001];
struct Seg {
  Seg* C[2];
  long long mx, is;
  int l, r;
  Seg(){};
  Seg(Seg* _cl, Seg* _cr, int _mx, int _is, int _l, int _r) {
    C[0] = _cl, C[1] = _cr, mx = _mx, is = _is, l = _l, r = _r;
  }
  void insert(int x, int y, long long ins) {
    if (x > y) return;
    if (l == r) {
      is += ins;
      b[l] += is;
      is = 0;
      mx = b[l];
      return;
    }
    if (l == x && r == y) {
      is += ins;
      mx += ins;
      return;
    }
    int md = (l + r) / 2;
    if (!C[0]) C[0] = new Seg(0, 0, 0, 0, l, md);
    if (!C[1]) C[1] = new Seg(0, 0, 0, 0, md + 1, r);
    if (is) {
      C[0]->insert(l, md, is);
      C[1]->insert(md + 1, r, is);
      is = 0;
    }
    if (y <= md)
      C[0]->insert(x, y, ins);
    else if (x > md)
      C[1]->insert(x, y, ins);
    else
      C[0]->insert(x, md, ins), C[1]->insert(md + 1, y, ins);
    mx = max(C[0]->mx, C[1]->mx);
  }
  long long findmax(int x, int y) {
    if (l == x && y == r || (!C[0] && !C[1])) return mx;
    int md = (l + r) / 2;
    if (is) {
      C[0]->insert(l, md, is);
      C[1]->insert(md + 1, r, is);
      is = 0;
    }
    if (y <= md) return C[0]->findmax(x, y);
    if (x > md) return C[1]->findmax(x, y);
    return max(C[0]->findmax(x, md), C[1]->findmax(md + 1, y));
  }
} * Root;
int main() {
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int i = 1; i <= m; ++i)
    cin >> ed[i].first.second >> ed[i].first.first >> ed[i].second;
  sort(ed + 1, ed + m + 1);
  for (int i = 1; i <= n; ++i) e[i].push_back(make_pair(i, -a[i]));
  for (int i = m; i >= 1; --i)
    e[ed[i].first.first].push_back(make_pair(ed[i].first.second, ed[i].second));
  for (int i = 1; i <= n; ++i) e[i].push_back(make_pair(0, 0));
  Root = new Seg(0, 0, 0, 0, 1, n);
  for (int i = 1; i <= n; ++i) {
    Root->insert(i, i, ans);
    int l = e[i].size();
    long long tmp = 0;
    for (int j = 0; j < l - 1; ++j) {
      tmp += e[i][j].second;
      Root->insert(e[i][j + 1].first + 1, e[i][j].first, tmp);
    }
    ans = max(ans, Root->findmax(1, i));
  }
  cout << ans << endl;
  return 0;
}
