#include<iostream>
#include<cstdio>
using namespace std;
struct Edge
{
int nxt,to;
}edge[2000005];
int head[100005];
int head2[100005];
int price[100005];
int m,n;
int n2=0;
int tot=0;
void add(int from,int to)
{
tot++;
edge[tot].to=to;
edge[tot].nxt=head[from];
head[from]=tot;
}
void add2(int from,int to)
{
tot++;
edge[tot].to=to;
edge[tot].nxt=head2[from];
head2[from]=tot;
}
int dfn[100005];
int low[100005];
int Stack[100005];
int color[100005];
int co=0;
int top=0;
int order=0;
int in[100005];
int maxc[100005];
int minc[100005];
void Tarjan(int now)
{
in[now]=1;
order++;
top++;
Stack[top]=now;
dfn[now]=order;
low[now]=order;
for(int i=head[now];i;i=edge[i].nxt)
{
int np=edge[i].to;
if(dfn[np]==0)
{
Tarjan(np);
low[now]=min(low[now],low[np]);
}
else if(in[np]==1)
{
low[now]=min(low[now],dfn[np]);
}
}
if(low[now]>=dfn[now])
{
co++;
maxc[co]=price[now];
minc[co]=price[now];
while(Stack[top]!=now)
{
maxc[co]=max(maxc[co],price[Stack[top]]);
minc[co]=min(minc[co],price[Stack[top]]);
color[Stack[top]]=co;
in[Stack[top]]=0;
if(Stack[top]==n)
{
n2=co;
}
top--;
}
if(Stack[top]==n)
{
n2=co;
}
color[Stack[top]]=co;
in[Stack[top]]=0;
top--;
}
}
void rebuild()
{
for(int i=1;i<=n;i++)
{
for(int q=head[i];q;q=edge[q].nxt)
{
int to=edge[q].to;
if(color[to]!=color[i])
{
add2(color[i],color[to]);
}
}
}
}
int eff[100005];
int vis[100005];
int dpmax[100005];
int dpmin[100005];
struct DP
{
int maxn,minn,ef;
}dp;
DP dfs(int now)
{
DP tmp;
if(vis[now])
{
tmp.maxn=dpmax[now];
tmp.minn=dpmin[now];
tmp.ef=eff[now];
return tmp;
}
vis[now]=1;
dpmax[now]=maxc[now];
dpmin[now]=minc[now];
if(now==n2)
eff[now]=1;
for(int i=head2[now];i;i=edge[i].nxt)
{
int np=edge[i].to;
DP t=dfs(np);
if(t.ef==1)
{
dpmax[now]=max(dpmax[now],t.maxn);
dpmin[now]=min(dpmin[now],t.minn);
eff[now]=1;
}
}
tmp.maxn=dpmax[now];
tmp.minn=dpmin[now];
tmp.ef=eff[now];
return tmp;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&price[i]);
}
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b);
if(c==2)
{
add(b,a);
}
}
Tarjan(1);
rebuild();
eff[n2]=1;
for(int i=1;i<=co;i++)
{
if(vis[i]==0)
{
dfs(i);
}
}
int ans=0;
for(int i=1;i<=co;i++)
{
if(eff[i])
{
ans=max(ans,dpmax[i]-dpmin[i]);
}
}
cout<<ans;
return 0;
}
// for(int i=1;i<=n;i++)
// {
// cout<<color[i]<<' ';
// }
// cout<<endl;
// for(int i=1;i<=co;i++)
// {
// cout<<i<<":\n";
// for(int q=head2[i];q;q=edge[q].nxt)
// {
// cout<<edge[q].to<<' ';
// }
// cout<<"\n";
// }
// cout<<endl;
// for(int i=1;i<=co;i++)
// {
// cout<<maxc[i]<<' '<<minc[i]<<endl;
// }cout<<endl;
// for(int i=1;i<=co;i++)
// {
// cout<<dpmax[i]<<' '<<dpmin[i]<<endl;
// }