#include<bits/stdc++.h>
using namespace std;
const int N=1e6+100;
int from[N],nt[N],to[N];
int n,m,ans=-1;
struct val{
int maxf;
int minf;
}v[N];
void addedge(int x,int y,int i){
to[i]=y;
nt[i]=from[x];
from[x]=i;
return;
}
int def[N],low[N];
void tajan(int x){
int i=from[x],xi;
while(to[i]){
xi=to[i];
if(def[xi]==0) {
def[xi]=def[x]+1;
low[xi]=def[xi];
tajan(xi);
if(low[xi]<low[x]) low[x]=low[xi];
}
else{
if(low[xi]<low[x]){
low[x]=low[xi];
if(v[xi].maxf>v[x].maxf)
v[x].maxf=v[xi].maxf;
else v[xi].maxf=v[x].maxf;
if(v[xi].minf<v[x].minf)
v[x].minf=v[xi].minf;
else v[xi].minf=v[x].minf;
}
}
i=nt[i];
}
return;
}
bool f[N];
void searchm(int maxm,int minf,int crr){
if(crr==n) ans=max(ans, maxm);
f[crr]=1;
if(v[crr].minf<minf)
minf=v[crr].minf;
if(v[crr].maxf-minf>maxm)
maxm=v[crr].maxf-minf;
int i=from[crr];
while(to[i]){
if(!f[to[i]]){
searchm(maxm,minf,to[i]);
}
i=nt[i];
}
f[N]=0;
return;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>v[i].maxf;
v[i].minf=v[i].maxf;
}
int x,y,z;
int ni=1,temp;
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
addedge(x,y,ni);
temp=v[y].maxf-v[x].minf;
if(n<=2) ans=max(ans,temp);
ni++;
if(z==2){
addedge(y,x,ni);
ni++;
}
}
tajan(1);
searchm(0,110,1);
cout<<ans;
return 0;
}