#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int N = 5e5 + 10;
int n, m, a[N];
int head[N << 1], nx[N << 1], ver[N << 1], idx;
inline void add(int x, int y) {
ver[idx] = y;
nx[idx] = head[x]; head[x] = idx++;
return;
}
int h[N], ne[N], to[N], tot;
inline void Add(int x, int y) {
to[tot] = y;
ne[tot] = h[x]; h[x] = tot++;
return;
}
int dfn[N], low[N], st[N], vis[N], ti, top, kind;
int co[N], p[N], xx[N], yy[N], type[N], Max[N];
inline void tarjan(int u) {
dfn[u] = low[u] = ++ti;
st[++top] = u, vis[u] = true;
for (int i = head[u]; ~i; i = nx[i]) {
int v = ver[i];
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
}
else if (vis[v])low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]) {
int v;
++kind;
while ((v = st[top--]) != 0) {
co[v] = kind;
vis[v] = false;
p[kind] = min(p[kind], a[v]);
Max[kind] = max(Max[kind], a[v]);
if (u == v)break;
}
}
return;
}
queue<int> que;
int d[N], dp[N];
inline int topu(void) {
for (int i = 1; i <= kind; ++i) {
if (d[i] == 0) {
que.push(i), dp[i] = max(0, Max[i] - p[i]);
}
}
while (que.size()) {
int u = que.front(); que.pop();
for (int i = h[u]; ~i; i = ne[i]) {
int v = to[i];
d[v] --;
dp[v] = max(dp[u], max(Max[v] - p[v] , 0));
if (d[v] == 0)que.push(v);
}
}
return dp[co[n]];
}
int main(void) {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
memset(head, -1, sizeof(head));
memset(h, -1, sizeof(h));
for (int i = 1; i <= n; ++i) {
p[i] = (1 << 30), Max[i] = 0;
}
for (int i = 1; i <= m; ++i) {
cin >> xx[i] >> yy[i] >> type[i];
add(xx[i], yy[i]);
if (type[i] == 2)add(yy[i], xx[i]);
}
for (int i = 1; i <= n; ++i) {
if (!dfn[i])
tarjan(i);
}
for (int i = 1; i <= m; ++i) {
int cx = co[xx[i]], cy = co[yy[i]];
if (cx == cy)continue;
Add(cx, cy); d[cy] ++;
if (type[i] == 2)Add(cy, cx), d[cx] ++;
}
cout << topu() << endl;
return 0;
}