#include <bits/stdc++.h>
#define int long long
#define pb push_back
#define erep(i, u) for(int i=h[u];~i;i=ne[i])
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
#define getchar() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++
namespace FIO{static char buf[1<<20],*p1=buf,*p2=buf;inline int rd(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();return x*f;}inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');}inline void pt(int x){if(!x)putchar('0');else{int s[20],t;for(t=0;x;x/=10)s[t++]=x%10;while(t)putchar(s[--t]^48);}putchar('\n');}}using namespace FIO;
namespace zty
{
const int N = 200010, M = 1000010;
bool m1;
int n, m, w[N];
int dfn[N], low[N], scc[N], cnt, scnt, stk[N], in[N], top, mx[N], mn[N];
int h[N], e[M], ne[M], idx;
int ind[N], dp[N], tot;
pair<int, int> edge[M];
bool m2;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++;
}
void tarjan(int u)
{
dfn[u] = low[u] = ++ cnt;
in[u] = 1, stk[++ top] = u;
erep(i, u)
{
int v = e[i];
if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
else if (in[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u])
{
scnt ++;
int f;
do
{
f = stk[top --];
scc[f] = scnt, in[f] = 0;
mx[scnt] = max(mx[scnt], w[f]), mn[scnt] = min(mn[scnt], w[f]);
}while (u != f);
}
}
void topsort()
{
queue<int> q;
q.push(scc[1]);
while (q.size())
{
int u = q.front();q.pop();
erep(i, u)
{
int v = e[i];
dp[v] = max(dp[v], dp[u]);
mn[v] = min(mn[v], mn[u]);
dp[v] = max(dp[v], mx[v] - mn[v]);
ind[v] --;
if (!ind[v]) q.push(v);
}
}
}
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//cout << fixed << setprecision(3) << (&m2 - &m1) / 1024.0 / 1024 << endl;
memset(h, -1, sizeof h), memset(mx, 0xff, sizeof mx), memset(mn, 0x3f, sizeof mn);
n = rd(), m = rd();
rep(i, 1, n) w[i] = rd();
rep(i, 1, m)
{
int a = rd(), b = rd(), op = rd();
add(a, b);
edge[++ tot] = {a, b};
if (op == 2) add(b, a), edge[++ tot] = {b, a};
}
tarjan(1);
memset(e, 0, sizeof e), memset(ne, 0, sizeof ne), memset(h, -1, sizeof h), idx = 0;
rep(i, 1, tot)
{
int u = edge[i].first, v = edge[i].second;
if (scc[u] != scc[v] && dfn[u] && dfn[v])
add(scc[u], scc[v]), ind[scc[v]] ++;
}
//rep(i, 1, n) cout << scc[i] << " "; cout << endl;
topsort();
cout << dp[scc[n]] << endl;
return 0;
}
}
signed main()
{
//freopen(".in", "r", stdin), freopen(".out", "w", stdout);freopen("P1073_4.in", "r", stdin);
zty::main();
}
有几个hack数据输出的都是0,不知道为什么