#include <bits/stdc++.h>
using namespace std;
struct Node {
  int l, r;
  long long maxi, lzy, maxiwthpre;
};
struct Line {
  int l, r, v;
  bool operator<(Line L) const { return l < L.l; }
};
int N, M;
Node seg[800050];
long long pre[200005];
Line arr[200005];
void build(int l, int r, int idx) {
  seg[idx].l = l;
  seg[idx].r = r;
  seg[idx].maxi = seg[idx].maxiwthpre = LLONG_MIN >> 2;
  if (l == r) {
    return;
  }
  int mid = (l + r) >> 1;
  build(l, mid, 2 * idx);
  build(mid + 1, r, 2 * idx + 1);
}
void pd(int idx) {
  seg[2 * idx].maxi += seg[idx].lzy;
  seg[2 * idx].maxiwthpre += seg[idx].lzy;
  seg[2 * idx].lzy += seg[idx].lzy;
  seg[2 * idx + 1].maxi += seg[idx].lzy;
  seg[2 * idx + 1].maxiwthpre += seg[idx].lzy;
  seg[2 * idx + 1].lzy += seg[idx].lzy;
  seg[idx].lzy = 0;
}
void pu(int idx) {
  seg[idx].maxi = max(seg[2 * idx].maxi, seg[2 * idx + 1].maxi);
  seg[idx].maxiwthpre =
      max(seg[2 * idx].maxiwthpre, seg[2 * idx + 1].maxiwthpre);
}
void add(int l, int r, long long v, int idx) {
  if (seg[idx].l == l && seg[idx].r == r) {
    seg[idx].lzy += v;
    seg[idx].maxi += v;
    seg[idx].maxiwthpre += v;
    return;
  }
  int mid = (seg[idx].l + seg[idx].r) >> 1;
  if (seg[idx].lzy) {
    pd(idx);
  }
  if (r <= mid) {
    add(l, r, v, 2 * idx);
  } else if (l > mid) {
    add(l, r, v, 2 * idx + 1);
  } else {
    add(l, mid, v, 2 * idx);
    add(mid + 1, r, v, 2 * idx + 1);
  }
  pu(idx);
}
void setval(int p, long long v, int idx) {
  if (seg[idx].l == seg[idx].r) {
    seg[idx].maxi = v;
    seg[idx].maxiwthpre = v + pre[p];
    return;
  }
  int mid = (seg[idx].l + seg[idx].r) >> 1;
  if (seg[idx].lzy) {
    pd(idx);
  }
  if (p <= mid) {
    setval(p, v, 2 * idx);
  } else {
    setval(p, v, 2 * idx + 1);
  }
  pu(idx);
}
long long query(int l, int r, int withpre, int idx) {
  if (seg[idx].l == l && seg[idx].r == r) {
    return withpre ? seg[idx].maxiwthpre : seg[idx].maxi;
  }
  int mid = (seg[idx].l + seg[idx].r) >> 1;
  if (seg[idx].lzy) {
    pd(idx);
  }
  if (r <= mid) {
    return query(l, r, withpre, 2 * idx);
  } else if (l > mid) {
    return query(l, r, withpre, 2 * idx + 1);
  } else {
    return max(query(l, mid, withpre, 2 * idx),
               query(mid + 1, r, withpre, 2 * idx + 1));
  }
}
int main() {
  cin >> N >> M;
  for (int i = 1; i <= N; i++) {
    cin >> pre[i];
    pre[i] += pre[i - 1];
  }
  for (int i = 1; i <= M; i++) {
    cin >> arr[i].l >> arr[i].r >> arr[i].v;
  }
  sort(arr + 1, arr + 1 + M);
  build(0, 200000, 1);
  setval(0, 0, 1);
  for (int i = 1; i <= M; i++) {
    add(arr[i].r, 200000, arr[i].v, 1);
    long long n = query(arr[i].r, arr[i].r, 0, 1);
    if (arr[i].l != arr[i].r) {
      n = max(n,
              query(arr[i].l, arr[i].r - 1, 1, 1) - pre[arr[i].r] + arr[i].v);
    }
    n = max(n, query(0, arr[i].l - 1, 0, 1) - pre[arr[i].r] +
                   pre[arr[i].l - 1] + arr[i].v);
    setval(arr[i].r, n, 1);
  }
  cout << seg[1].maxi << endl;
}
