#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1);
const double R = 0.57721566490153286060651209;
const int N = 2e5 + 10;
struct node {
  int l, r;
  long long p;
} a[N];
struct Tree {
  int l, r;
  long long mx;
  long long tag;
} t[N << 2];
inline void push_up(int u) { t[u].mx = max(t[u << 1].mx, t[u << 1 | 1].mx); }
inline void push_down(int u) {
  if (!t[u].tag) return;
  t[u << 1].tag += t[u].tag;
  t[u << 1 | 1].tag += t[u].tag;
  t[u << 1].mx += t[u].tag;
  t[u << 1 | 1].mx += t[u].tag;
  t[u].tag = 0;
}
void build(int u, int l, int r) {
  t[u].l = l;
  t[u].r = r;
  t[u].mx = 0;
  if (l == r) return;
  int m = (l + r) >> 1;
  build(u << 1, l, m);
  build(u << 1 | 1, m + 1, r);
  push_up(u);
}
void modify(int u, int ql, int qr, long long val) {
  if (ql <= t[u].l && t[u].r <= qr) {
    t[u].mx += val;
    t[u].tag += val;
    return;
  }
  push_down(u);
  if (ql <= (t[u].l + t[u].r) >> 1) modify(u << 1, ql, qr, val);
  if (qr > (t[u].l + t[u].r) >> 1) modify(u << 1 | 1, ql, qr, val);
  push_up(u);
}
bool cmp(node a, node b) {
  if (a.r == b.r) return a.l < b.l;
  return a.r < b.r;
}
void solve() {
  int n, m;
  cin >> n >> m;
  vector<long long> cost(n + 1), dp(n + 1);
  for (int i = 1; i <= n; i++) cin >> cost[i];
  for (int i = 1; i <= m; i++) cin >> a[i].l >> a[i].r >> a[i].p;
  sort(a + 1, a + m + 1, cmp);
  dp[0] = 0;
  build(1, 0, n);
  int cnt = 1;
  for (int i = 1; i <= n; i++) {
    modify(1, 0, i - 1, -cost[i]);
    while (a[cnt].r <= i && cnt <= m) {
      modify(1, 0, a[cnt].l - 1, a[cnt].p);
      cnt++;
    }
    dp[i] = max(dp[i - 1], t[1].mx);
    modify(1, i, i, dp[i]);
  }
  cout << dp[n] << "\n";
}
signed main() {
  ios_base::sync_with_stdio(false);
  solve();
  return 0;
}
