#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=1e6+10,M=5e6+10;
int h[N],rh[N],e[M],ne[M],idx;
int p[N],dmax[N],dmin[N];
bool st[N];
int n,m;
void add(int *h,int a,int b){
e[idx]=b;ne[idx]=h[a];h[a]=idx++;
}
void spfa_max(){
queue<int> q;
memset(st,0,sizeof st);
q.push(n);
dmax[n]=p[n];
while(q.size()){
int t=q.front();
q.pop();
st[t]=false;
for(int i=rh[t];~i;i=ne[i]){
int j=e[i];
if(dmax[j]<max(p[j],dmax[t])){
dmax[j]=max(p[j],dmax[t]);
if(!st[j]){
st[j]=true;
q.push(j);
}
}
}
}
}
void spfa_min(){
queue<int> q;
memset(st,0,sizeof st);
memset(dmin,0x3f,sizeof dmin);
q.push(1);
dmin[1]=p[1];
while(q.size()){
int t=q.front();
q.pop();
st[t]=false;
for(int i=h[t];~i;i=ne[i]){
int j=e[i];
if(dmin[j]>min(dmin[t],p[j])){
dmin[j]=min(dmin[t],p[j]);
if(!st[j]){
st[j]=true;
q.push(j);
}
}
}
}
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof h);
memset(rh,-1,sizeof rh);
for(int i=1;i<=n;i++) scanf("%d",&p[i]);
for(;m;m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(h,a,b),add(rh,b,a);
if(c==2) add(h,b,a),add(rh,a,b);
}
spfa_max(); spfa_min();
int res=0;
for(int i=1;i<=n;i++) res=max(res,dmax[i]-dmin[i]);
cout<<res;
return 0;
}