#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T read() {
  T x = 0;
  char ch = getchar();
  bool fl = false;
  while (!isdigit(ch)) {
    if (ch == '-') fl = true;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return fl ? -x : x;
}
const int maxn = 2e5 + 10;
const long long INF = 0x3f3f3f3f3f3f3f3f;
long long n, m;
vector<pair<long long, long long> > a[maxn];
long long cost[maxn];
namespace Segment_tree {
struct node {
  long long l, r;
  long long mx, tag;
} t[maxn << 2];
void build(long long p, long long l, long long r) {
  t[p].l = l, t[p].r = r;
  if (l == r) return;
  build((p << 1), l, ((l + r) >> 1));
  build((p << 1 | 1), ((l + r) >> 1) + 1, r);
}
inline void pushup(long long p) {
  t[p].mx = max(t[(p << 1)].mx, t[(p << 1 | 1)].mx);
  return;
}
inline void pushdown(long long p) {
  if (!t[p].tag) return;
  t[(p << 1)].mx += t[p].tag;
  t[(p << 1 | 1)].mx += t[p].tag;
  t[(p << 1)].tag += t[p].tag;
  t[(p << 1 | 1)].tag += t[p].tag;
  t[p].tag = 0;
  return;
}
void update(long long p, long long x, long long y, long long val) {
  long long l = t[p].l, r = t[p].r;
  if (x <= l && r <= y) {
    t[p].mx += val;
    t[p].tag += val;
    return;
  }
  pushdown(p);
  if (x <= ((l + r) >> 1)) update((p << 1), x, y, val);
  if (y > ((l + r) >> 1)) update((p << 1 | 1), x, y, val);
  pushup(p);
}
long long query(long long p, long long x, long long y) {
  long long l = t[p].l, r = t[p].r;
  if (x <= l && r <= y) return t[p].mx;
  pushdown(p);
  long long res = -INF;
  if (x <= ((l + r) >> 1)) res = max(res, query((p << 1), x, y));
  if (y > ((l + r) >> 1)) res = max(res, query((p << 1 | 1), x, y));
  return res;
}
}  // namespace Segment_tree
using namespace Segment_tree;
long long f[maxn];
signed main() {
  n = read<long long>();
  m = read<long long>();
  for (long long i = 1; i <= n; i++) cost[i] = read<long long>();
  for (long long i = 1; i <= m; i++) {
    long long l = read<long long>(), r = read<long long>();
    long long w = read<long long>();
    a[r].push_back(make_pair(l, w));
  }
  build(1, 0, n);
  for (long long i = 1; i <= n; i++) {
    update(1, 0, i - 1, -cost[i]);
    for (long long j = 0; j < a[i].size(); j++) {
      update(1, 0, a[i][j].first - 1, a[i][j].second);
    }
    f[i] = max(f[i - 1], query(1, 0, i - 1));
    update(1, i, i, f[i]);
  }
  printf("%lld\n", f[n]);
  return 0;
}
