#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int n, m, a[N], f[N], dfn[N], low[N], c[N], num, cnt, maxn[N], minn[N];
bool st[N];
vector <int> g[N], b[N];
struct node {
int u, v, z;
};
node t[N];
stack <int> s;
void tarjan (int u) {
dfn[u] = low[u] = ++ num;
s.push(u);
st[u] = true;
for (int v : g[u]) {
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if (st[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]) {
++ cnt;
c[u] = cnt;
maxn[cnt] = minn[cnt] = a[u];
while (s.top() != u) {
c[s.top()] = cnt;
maxn[cnt] = max(maxn[cnt], a[s.top()]);
minn[cnt] = min(minn[cnt], a[s.top()]);
st[s.top()] = false;
s.pop();
}
st[s.top()] = false;
s.pop();
}
}
int dfs (int u) {
if (f[u] != -1) return f[u];
int ans = maxn[u];
for (int v : b[u])
ans = max(ans, dfs(v));
return f[u] = ans;
}
bool is[N];
void Dfs (int u) {
is[u] = true;
for (int v : b[u])
if (!is[v])
Dfs(v);
return;
}
signed main() {
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; ++ i ) scanf("%lld", a + i);
for (int i = 1, u, v, z; i <= m; ++ i ) {
scanf("%lld%lld%lld", &u, &v, &z);
if (z == 1) g[u].push_back(v);
else {
g[u].push_back(v);
g[v].push_back(u);
}
t[i] = {u, v, z};
}
for (int i = 1; i <= n; ++ i )
if (!dfn[i])
tarjan(i);
for (int i = 1; i <= m; ++ i ) {
if (t[i].z == 1) {
if (c[t[i].u] ^ c[t[i].v]) b[c[t[i].u]].push_back(c[t[i].v]);
}
}
memset(f, -1, sizeof(f));+
int ans = 0;
Dfs(c[1]);
bool ok = false;
for (int i = 1; i <= cnt; ++ i )
if (is[i])
ans = max(ans, dfs(i) - minn[i]);
printf("%lld\n", ans);
return 0;
}