#include <bits/stdc++.h>
#pragma GCC optimize(2)
const long long MAXN = 2e5 + 10;
const long long MAXM = MAXN << 2;
struct Road {
  long long l, u, p;
} e[MAXN];
long long n, m, root, a[MAXN], f[MAXN], sum[MAXN];
std::vector<std::pair<long long, long long> > node[MAXN];
namespace Segtree {
long long cnt, lazy[MAXM], max_num[MAXM], ls[MAXM], rs[MAXM], l[MAXM], r[MAXM];
inline void build(long long &cur, long long L, long long R) {
  cur = ++cnt;
  l[cur] = L, r[cur] = R;
  if (L == R) {
    max_num[L] = a[L];
    return;
  }
  long long mid = (L + R) >> 1;
  build(ls[cur], L, mid), build(rs[cur], mid + 1, R);
}
inline void push_down(long long cur) {
  if (!lazy[cur]) return;
  lazy[ls[cur]] += lazy[cur], lazy[rs[cur]] += lazy[cur];
  max_num[ls[cur]] += lazy[cur], max_num[rs[cur]] += lazy[cur];
  lazy[cur] = 0;
}
inline void Modification(long long L, long long R, long long cur,
                         long long add) {
  if (L <= l[cur] and r[cur] <= R) {
    lazy[cur] += add, max_num[cur] += add;
    return;
  }
  push_down(cur);
  long long mid = (l[cur] + r[cur]) >> 1;
  if (L <= mid) Modification(L, R, ls[cur], add);
  if (R > mid) Modification(L, R, rs[cur], add);
  max_num[cur] = std::max(max_num[ls[cur]], max_num[rs[cur]]);
}
inline long long query(long long L, long long R, long long cur) {
  if (L <= l[cur] and r[cur] <= R) return max_num[cur];
  push_down(cur);
  long long mid = (l[cur] + r[cur]) >> 1, res = 0;
  if (L <= mid) res = std::max(res, query(L, R, ls[cur]));
  if (R > mid) res = std::max(res, query(L, R, rs[cur]));
  return res;
}
}  // namespace Segtree
inline long long read() {
  long long X = 0, flag = 0;
  char ch = 0;
  while (!isdigit(ch)) flag |= ch == '-', ch = getchar();
  while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
  return flag ? -X : X;
}
inline bool cmp(Road x, Road y) { return x.u < y.u; }
inline void write(long long X) {
  if (X < 0) putchar('-'), X = -X;
  if (X > 9) write(X / 10);
  putchar(X % 10 + '0');
}
signed main() {
  n = read(), m = read(), Segtree::build(root, 0, n);
  for (register long long i = 1; i <= n; i++)
    a[i] = read(), sum[i] = sum[i - 1] + a[i];
  for (register long long i = 1; i <= m; i++) {
    e[i].l = read(), e[i].u = read(), e[i].p = read();
    node[e[i].u].push_back(std::make_pair(e[i].l, e[i].p));
  }
  std::sort(e + 1, e + n + 1, cmp);
  for (register long long i = 1; i <= n; i++) {
    Segtree::Modification(i, i, 1, Segtree::query(0, i - 1, 1));
    for (register long long j = 0; j < node[i].size(); j++)
      Segtree::Modification(0, node[i][j].first - 1, 1, node[i][j].second);
    Segtree::Modification(0, i - 1, 1, -a[i]);
  }
  write(Segtree::max_num[1]);
  return 0;
}
