#include <cstdio>
inline int readint(){
int f = 1, n = 0;
char ch = getchar();
while(ch < ‘0‘ || ch > ‘9‘){
if(ch == ‘-‘) f = -1;
ch = getchar();
}
while(ch <= ‘9‘ && ch >= ‘0‘){
n = (n << 1) + (n << 3) + ch - ‘0‘;
ch = getchar();
}
return f * n;
}
const int maxn = 1000 + 10, maxm = 10000 + 10, INF = 0x3f3f3f3f;
struct Edge{
int to, cap, cost, next;
Edge(){}
Edge(int _t, int _w, int _c, int _n): to(_t), cap(_w), cost(_c), next(_n){}
}e[maxm << 2];
int fir[maxn] = {0}, cnt = 1;
inline void ins(int u, int v, int w, int c){
e[++cnt] = Edge(v, w, c, fir[u]); fir[u] = cnt;
e[++cnt] = Edge(u, 0, -c, fir[v]); fir[v] = cnt;
}
int num[maxn] = {0};
int sour, sink;
bool inq[maxn] = {false};
int dis[maxn];
int q[maxn], head, tail;
int pre[maxn];
bool SPFA(){
for(int i = sour; i <= sink; i++){
dis[i] = INF;
inq[i] = false;
pre[i] = 0;
}
head = tail = 0;
dis[sour] = 0;
inq[sour] = true;
q[tail++] = sour;
int u, v;
while(head != tail){
u = q[head++];
if(head == 1010) head = 0;
inq[u] = false;
for(int i = fir[u]; i; i = e[i].next){
v = e[i].to;
if(e[i].cap && dis[v] > dis[u] + e[i].cost){
dis[v] = dis[u] + e[i].cost;
pre[v] = i;
if(!inq[v]){
inq[v] = true;
q[tail++] = v;
if(tail == 1010) tail = 0;
}
}
}
}
return dis[sink] != INF;
}
void MCMF(){
int flow, cost = 0;
while(SPFA()){
flow = INF;
for(int i = pre[sink]; i; i = pre[e[i ^ 1].to])
if(e[i].cap < flow) flow = e[i].cap;
for(int i = pre[sink]; i; i = pre[e[i ^ 1].to]){
e[i].cap -= flow;
e[i ^ 1].cap += flow;
}
cost += flow * dis[sink];
}
printf("%d\n", cost);
}
int main(){
int n, m;
n = readint();
m = readint();
for(int i = 1; i <= n; i++)
num[i] = readint();
for(int a, b, c, i = 1; i <= m; i++){
a = readint();
b = readint();
c = readint();
ins(a, b + 1, INF, c);
}
sour = 0;
sink = n + 2;
for(int t, i = 1; i <= n + 1; i++){
t = num[i] - num[i - 1];
if(t >= 0) ins(sour, i, t, 0);
else ins(i, sink, -t, 0);
if(i) ins(i, i - 1, INF, 0);
}
MCMF();
return 0;
}