#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int n, m, ans, a[maxn];
struct Node {int to, next, from;} e[maxn], e2[maxn];
int len, head[maxn], len2, head2[maxn];
void Insert(int u, int v, int &len, int head[], Node e[]) {e[++len].to = v; e[len].from = u; e[len].next = head[u]; head[u] = len;}
int top, cnt, Time, q[maxn], dfn[maxn], low[maxn], vis[maxn], siz_min[maxn], siz_max[maxn], belong[maxn];
void Tarjan(int u){
dfn[u] = low[u] = ++Time; vis[u] = 1; q[++top] = u;
for(int i = head[u]; i; i = e[i].next){
int v = e[i].to;
if(!dfn[v]){
Tarjan(v);
low[u] = min(low[u], low[v]);
}else if( vis[v]) low[u] = min(low[u], dfn[v]);
}
if(low[u] == dfn[u]){
++cnt;
while(q[top + 1] != u){
int v = q[top--];
belong[v] = cnt; vis[v] = 0;
siz_min[cnt] = min(siz_min[cnt], a[v]); siz_max[cnt] = max(siz_max[cnt], a[v]);
}
}
}
int dp[maxn][5];
void dfs(int u){
if( dp[u][1]) return;
if(u == belong[n]) dp[u][2] = 1;
dp[u][1] = siz_max[u];
for(int i = head2[u]; i; i = e2[i].next){
int v = e2[i].to;
dfs(v);
if( dp[v][2]) dp[u][1] = max(dp[u][1], dp[v][1]), ans = max(ans, dp[u][1] - siz_min[u]);
}
}
void Solve(){
memset(siz_min, 0x3f, sizeof siz_min);
cin>>n>>m;
for(int i = 1; i <= n; ++i) cin>>a[i];
for(int i = 1; i <= m; ++i) {int u, v, opt; cin>>u>>v>>opt; Insert(u, v, len, head, e); if(opt == 2) Insert(v, u, len, head, e);}
Tarjan(1);
for(int i = 1; i <= len; ++i){
int u = belong[e[i].from], v = belong[e[i].to];
if(u != v) Insert(u, v, len2, head2, e2);
}
dfs(belong[1]);
cout<<ans<<endl;
}
int main(){
Solve();
return 0;
}
/*
第三个测试点
2 1
1 100
1 2 1
99
*/