#include <bits/stdc++.h>
using namespace std;
const int INF = (int)1E9;
const long long LINF = (long long)1E18;
const long double PI = acos(-1.0);
const long double EPS = 1E-9;
template <typename T>
T gcd(T a, T b) {
  return (b == 0) ? abs(a) : gcd(b, a % b);
}
template <typename T>
inline T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <typename T>
inline T mod(T a, T b) {
  a %= b;
  if (a < 0) a += b;
  return a;
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
template <typename T>
inline T gmax(T a, T b) {
  return (a > b ? a : b);
}
template <typename T>
inline T gmin(T a, T b) {
  return (a < b ? a : b);
}
template <typename T>
inline string toString(T x) {
  ostringstream oss;
  oss << x;
  return oss.str();
}
inline long long toInt(const string& st) {
  istringstream iss(st);
  long long x;
  iss >> x;
  return x;
}
inline long double toDouble(const string& st) {
  istringstream iss(st);
  long double x;
  iss >> x;
  return x;
}
inline string toLower(string st) {
  for (int i = 0; i < (((int)(st).size())); i++) st[i] = tolower(st[i]);
  return st;
}
inline string toUpper(string st) {
  for (int i = 0; i < (((int)(st).size())); i++) st[i] = toupper(st[i]);
  return st;
}
bool LOCAL = false, OUTPUT = true;
const char DEBUG_PARAM[] = "__LOCAL_TESTING";
const char IN[] = "input.txt";
const char OUT[] = "output.txt";
inline void init();
inline void run();
int ntest = 0, test;
int main(int argc, char* argv[]) {
  if (argc > 1 && strcmp(argv[1], DEBUG_PARAM) == 0) {
    LOCAL = true;
    freopen(IN, "r", stdin);
  }
  init();
  if (ntest == 0) {
    cerr << "ntest = ?" << endl;
    return 0;
  }
  for (test = 1; test <= ntest; ++test) {
    run();
  }
  return 0;
}
inline void stop() { ntest = test - 1; }
const int dx[] = {-1, 0, 0, 1};
const int dy[] = {0, -1, 1, 0};
inline void init() {
  OUTPUT = true;
  ntest = 1;
}
const int maxn = 2e5 + 5;
struct edge {
  int prev;
  long long cost;
  edge(int p, long long c) {
    prev = p;
    cost = c;
  }
};
int n, m;
long long a[maxn];
long long tree[maxn * 4];
long long add[maxn * 4];
list<edge> lis[maxn];
void update(int l, int r, int u, int v, int num, long long cost) {
  if (r < u || l > v) return;
  if (l <= u && r >= v) {
    add[num] += cost;
    return;
  }
  add[num * 2] += add[num];
  add[num * 2 + 1] += add[num];
  add[num] = 0;
  int mid = (u + v) >> 1;
  update(l, r, u, mid, num * 2, cost);
  update(l, r, mid + 1, v, num * 2 + 1, cost);
  tree[num] =
      gmax(tree[num * 2] + add[num * 2], tree[num * 2 + 1] + add[num * 2 + 1]);
}
long long get(int l, int r, int u, int v, int num) {
  if (r < u || l > v) return -1000000000000000000LL;
  if (l <= u && r >= v) return tree[num] + add[num];
  add[num * 2] += add[num];
  add[num * 2 + 1] += add[num];
  add[num] = 0;
  int mid = (u + v) >> 1;
  long long t1 = get(l, r, u, mid, num * 2);
  long long t2 = get(l, r, mid + 1, v, num * 2 + 1);
  tree[num] =
      gmax(tree[num * 2] + add[num * 2], tree[num * 2 + 1] + add[num * 2 + 1]);
  return gmax(t1, t2);
}
void solve() {
  long long temp;
  for (int i = (1); i <= (n); i++) {
    temp = get(0, i - 1, 0, n, 1);
    update(i, i, 0, n, 1, temp);
    update(0, i - 1, 0, n, 1, -a[i]);
    for (typeof((lis[i]).begin()) it = (lis[i]).begin(); it != (lis[i]).end();
         ++it) {
      update(0, it->prev - 1, 0, n, 1, it->cost);
    }
  }
  cout << get(0, n, 0, n, 1);
}
inline void run() {
  cin >> n >> m;
  for (int i = (1); i <= (n); i++) cin >> a[i];
  int u, v;
  long long c;
  for (int i = (1); i <= (m); i++) {
    cin >> u >> v >> c;
    lis[v].push_back(edge(u, c));
  }
  solve();
}
