#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &os, vector<T> vec) {
  os << '{';
  for (int i = (0); i < (int((vec).size())); ++i) {
    os << vec[i];
    if (i + 1 != int((vec).size())) os << ',';
  }
  os << '}';
  return os;
}
template <class T1, class T2>
ostream &operator<<(ostream &os, pair<T1, T2> par) {
  os << '(' << par.first << ',' << par.second << ')';
  return os;
}
template <int N>
class SegmentTree {
  pair<long long, long long> a[N * 4];
  int n;
  void add(int x, int y, long long c, int v, int l, int r) {
    if (x >= y) return;
    if (x == l && y == r) {
      a[v].first += c;
      a[v].second += c;
      return;
    }
    int m = (l + r) / 2;
    add(x, min(y, m), c, v * 2 + 1, l, m);
    add(max(x, m), y, c, v * 2 + 2, m, r);
    a[v].first = max(a[v * 2 + 1].first, a[v * 2 + 2].first) + a[v].second;
  }

 public:
  void init(int n) {
    this->n = n;
    memset(a, 0, sizeof a);
  }
  void add(int x, int y, long long c) { add(x, y, c, 0, 0, n); }
  long long getMax() { return a[0].first; }
};
int a[220 * 1000];
pair<pair<int, int>, int> b[220 * 1000];
SegmentTree<220 * 1000> tree;
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = (0); i < (n); ++i) {
    scanf("%d", &a[i]);
  }
  for (int i = (0); i < (m); ++i) {
    scanf("%d%d%d", &b[i].first.second, &b[i].first.first, &b[i].second);
    --b[i].first.first;
  }
  sort(b, b + m);
  tree.init(n + 1);
  int j = 0;
  for (int i = (0); i < (n); ++i) {
    long long end = tree.getMax() + a[i];
    tree.add(i + 1, i + 2, end);
    for (; j < m && b[j].first.first == i; ++j) {
      tree.add(0, b[j].first.second, b[j].second);
    }
  }
  long long ans = tree.getMax();
  for (int i = (0); i < (n); ++i) ans -= a[i];
  cout << ans << endl;
  return 0;
}
