#include <bits/stdc++.h>
using namespace std;
long long n, m, c[200010], dp[200010];
long long gi() {
  long long w = 0, f = 1;
  char ch;
  while (!isdigit(ch)) {
    f = ch == '-' ? -1 : 1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    w = (w << 1) + (w << 3) + ch - 48;
    ch = getchar();
  }
  return w * f;
}
struct node {
  long long l, r, p;
} a[200010];
vector<long long> q[200010];
struct SEGTREE {
  long long Max[200010 << 2], lazy[200010 << 2];
  void down(long long x, long long l, long long r) {
    if (lazy[x] == 0) return;
    Max[x << 1] += lazy[x];
    Max[x << 1 | 1] += lazy[x];
    lazy[x << 1] += lazy[x];
    lazy[x << 1 | 1] += lazy[x];
    lazy[x] = 0;
  }
  void update(long long x, long long l, long long r, long long xl, long long xr,
              long long v) {
    if (xl > xr) return;
    if (l == xl && r == xr) {
      Max[x] += v;
      lazy[x] += v;
      return;
    }
    long long mid = (l + r) >> 1;
    down(x, l, r);
    if (xr <= mid)
      update(x << 1, l, mid, xl, xr, v);
    else if (xl > mid)
      update(x << 1 | 1, mid + 1, r, xl, xr, v);
    else
      update(x << 1, l, mid, xl, mid, v),
          update(x << 1 | 1, mid + 1, r, mid + 1, xr, v);
    Max[x] = max(Max[x << 1], Max[x << 1 | 1]);
  }
} T;
signed main() {
  n = gi();
  m = gi();
  for (long long i = 1; i <= n; i++) c[i] = gi();
  for (long long i = 1; i <= m; i++) {
    a[i].l = gi();
    a[i].r = gi();
    a[i].p = gi();
    q[a[i].r].push_back(i);
  }
  for (long long i = 1; i <= n; i++) {
    T.update(1, 0, n, 0, i - 1, -c[i]);
    for (long long j = 0; j < q[i].size(); j++) {
      T.update(1, 0, n, 0, a[q[i][j]].l - 1, a[q[i][j]].p);
    }
    dp[i] = max(dp[i - 1], T.Max[1]);
    T.update(1, 0, n, i, i, dp[i]);
  }
  cout << dp[n] << "\n";
}
