rt
#include<bits/stdc++.h>
using namespace std;
int n,m,tot;
int head[100010],nxt[500010],a[100010],to[500010];
void insert(int x,int y)
{
to[tot]=y;
nxt[tot]=head[x];
head[x]=tot++;
}
int ma[100010],mi[100010];
priority_queue<pair<int,int>> q;
void spfa(int s,bool flag)
{
if(flag=0)memset(mi,0x3f,sizeof(mi));
else memset(ma,-0x3f,sizeof(ma));
if(!flag)
{
mi[s]=a[s];
q.push(make_pair(-mi[s],s));
}
else
{
ma[s]=a[s];
q.push(make_pair(mi[s],s));
}
for(;!q.empty();)
{
int x=q.top().second;
q.pop();
for(int j=head[x];j!=-1;j=nxt[j])
{
if(!flag)
{
if(mi[to[j]]>mi[x])
{
mi[to[j]]=min(a[to[j]],mi[x]);
q.push(make_pair(-mi[to[j]],to[j]));
}
}
else
{
if(ma[to[j]]<ma[x])
{
ma[to[j]]=max(a[to[j]],ma[x]);
q.push(make_pair(ma[to[j]],to[j]));
}
}
}
}
}
int x[100010],y[100010],z[100010];
int main()
{
memset(head,-1,sizeof(head));
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)
{
cin>>x[i]>>y[i]>>z[i];
if(z[i]==1)insert(x[i],y[i]);
else insert(x[i],y[i]),insert(y[i],x[i]);
}
spfa(1,0);
memset(head,-1,sizeof(head));
tot=0;
for(int i=1;i<=m;i++)
{
if(z[i]==1)insert(y[i],x[i]);
else insert(x[i],y[i]),insert(y[i],x[i]);
}
spfa(n,1);
int ans=0;
for(int i=1;i<=n;i++)ans=max(ans,ma[i]-mi[i]);
cout<<ans;
}