#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
using namespace std;
const int N=100005;
const int M=500005;
int n,m;
int price[N];
int fx[N];
int head[2*N];
int nxt[2*M];
int to[2*M];
int tot=0;
int dfn[N];
int low[N];
int num=0;
int co[N];
int col=0;
int sz[N];
int mix[N];//2e9!!!;
int mx[N];//0!!!
queue<int> q;
stack<int> s;
int in[2*N];
inline void add(int x,int y)
{
nxt[++tot]=head[x];
head[x]=tot;
to[tot]=y;
return ;
}
void tarjan(int x)
{
num++;
dfn[x]=low[x]=num;
s.push(x);
for(int i=head[x];i;i=nxt[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v);
low[x]=min(low[x],low[v]);
}
else
{
if(!co[v])
low[x]=min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x])
{
co[x]=++col;
++sz[col];
mix[col]=min(mix[col],price[x]);
mx[col]=max(mx[col],price[x]);
while(s.top()!=x)
{
++sz[col];
co[s.top()]=col;
mix[col]=min(mix[col],price[s.top()]);
mx[col]=max(mx[col],price[s.top()]);
s.pop();
}
s.pop();
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%d",&price[i]);
mix[i]=2e9;
//mx[i]=0;
}
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y);
if(z==2)
add(y,x);
}
tarjan(1);
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=nxt[j])
{
if(co[i]!=co[to[j]])
{
in[co[to[j]]+n]++;
add(co[i]+n,co[to[j]]+n);
}
}
}
for(int i=n+1;i<=n+col;i++)
{
if(!in[i])
{
q.push(i);
//cout<<i<<endl;
// cout<<"yesri"<<endl;
fx[i-n]=mix[i-n];
}
}
int ans=0;
while(!q.empty())
{
int a=q.front();
q.pop();
//cout<<a<<endl;
for(int i=head[a];i;i=nxt[i])
{
//cout<<"fuckyou"<<endl;
int y=to[i];
in[y]--;
fx[y-n]=min(fx[a-n],mix[y-n]);
//cout<<y<<" "<<fx[y]<<endl;
ans=max(ans,mx[y-n]-fx[y-n]);
if(in[y]==0)
{
q.push(y);
}
}
}
cout<<ans;
return 0;
}