#include <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
long long H[1 << 24], W;
struct SA {
  long long *A, *S, *X, *M;
  int N;
  void ini(int n) {
    N = 1 << (int(log2(n) - (1e-10)) + 1);
    A = H + W, W += N * 2, S = H + W, W += N * 2;
    X = H + W, W += N * 2, M = H + W, W += N * 2;
    for (int i(0); i < N << 1; i++) A[i] = S[i] = X[i] = 0, M[i] = 1;
  }
  void gt(int u, long long &s, long long &x, long long &m, int b, int e) {
    if (M[u] > X[u])
      m = x = A[u], s = (e - b + 1) * A[u];
    else
      m = M[u] + A[u], x = X[u] + A[u], s = S[u] + A[u] * (e - b + 1);
  }
  void st(int b, int e, long long v = 0) { st(b, e, v, 1, 0, N - 1); }
  void st(int b, int e, long long v, int u, int B, int E) {
    if (B > e || E < b) return;
    if (M[u] > X[u] && B ^ E)
      M[u << 1 | 1] = M[u << 1] = 1, X[u << 1 | 1] = X[u << 1] = 0,
                 A[u << 1 | 1] = A[u << 1] = A[u], A[u] = 0;
    if (b <= B && e >= E) {
      M[u] = 1, X[u] = 0, A[u] = v;
      return;
    }
    long long U, V, W;
    if (A[u])
      ad(B, E, A[u], u << 1, B, (B + E) >> 1),
          ad(B, E, A[u], u << 1 | 1, (B + E) / 2 + 1, E), A[u] = 0;
    st(b, e, v, u << 1, B, (B + E) >> 1),
        st(b, e, v, u << 1 | 1, (B + E) / 2 + 1, E);
    gt(u << 1, S[u], X[u], M[u], B, (B + E) >> 1),
        gt(u << 1 | 1, U, V, W, (B + E) / 2 + 1, E);
    S[u] += U, X[u] = max(X[u], V), M[u] = min(M[u], W);
  }
  void ad(int b, int e, long long v = 1) { ad(b, e, v, 1, 0, N - 1); }
  void ad(int b, int e, long long v, int u, int B, int E) {
    if (B > e || E < b) return;
    if (M[u] > X[u] && B ^ E)
      M[u << 1 | 1] = M[u << 1] = 1, X[u << 1 | 1] = X[u << 1] = 0,
                 A[u << 1 | 1] = A[u << 1] = A[u];
    if (M[u] > X[u]) gt(u, S[u], X[u], M[u], B, E), A[u] = 0;
    if (b <= B && e >= E) {
      A[u] += v;
      return;
    }
    long long U, V, W;
    ad(b, e, v, u << 1, B, (B + E) >> 1),
        ad(b, e, v, u << 1 | 1, (B + E) / 2 + 1, E);
    gt(u << 1, S[u], X[u], M[u], B, (B + E) >> 1),
        gt(u << 1 | 1, U, V, W, (B + E) / 2 + 1, E);
    S[u] += U, X[u] = max(X[u], V), M[u] = min(M[u], W);
  }
  void gt(int b, int e, long long &s, long long &x, long long &m) {
    s = 0, x = -1e18, m = 1e18;
    gt(b, e, 1, 0, N - 1, s, x, m);
  }
  void gt(int b, int e, int u, int B, int E, long long &s, long long &x,
          long long &m) {
    if (B > e || E < b) return;
    long long U = -1e18, V = 1e18, W;
    if (X[u] < M[u] || (b <= B && e >= E))
      gt(u, U, V, W, max(b, B), min(e, E)), s += U, x = max(x, V),
                                                    m = min(m, W);
    else
      gt(b, e, u << 1, B, (B + E) >> 1, s, U, V),
          gt(b, e, u << 1 | 1, (B + E) / 2 + 1, E, s, U, V),
          x = max(x, U + A[u]), m = min(m, V + A[u]),
          s += A[u] * (1 + min(e, E) - max(b, B));
  }
  long long mx(int b, int e) {
    long long u, v, w;
    return gt(b, e, u, v, w), v;
  }
  long long mn(int b, int e) {
    long long u, v, w;
    return gt(b, e, u, v, w), w;
  }
  long long sm(int b, int e) {
    long long u, v, w;
    return gt(b, e, u, v, w), u;
  }
} T;
vector<pair<int, int> > g[222222];
int N, M, a, b, c, P[222222];
long long l;
int main(void) {
  scanf("%d%d", &N, &M), T.ini(N + 2), ga(N, P);
  for (int i(0); i < M; i++)
    scanf("%d%d%d", &a, &b, &c), g[--a].push_back({--b, c});
  for (int i = N - 1; ~i; --i) {
    for (auto &h : g[i]) T.ad(h.first, N - 1, h.second);
    T.ad(i, N - 1, -P[i]);
    T.ad(i, i, l);
    l = max(l, T.mx(i, N));
  }
  printf("%lld\n", l);
  return 0;
}
