#include<bits/stdc++.h>
using namespace std;
#define N 100080
#define M 1000040
int n,m,a[M],b[M],s[N];//主程序
struct edge {
int to,next;
} line[M];
int head[N],cnt=0;//建图
int dfn[N]= {0},low[N]= {0},nn=0,vis[N]= {0},countt=0,belong[N]= {0};
stack<int>S;
int minn[N],maxn[N]= {0};//tarjan
int in[N]= {0},deep[N]= {0};
inline int get(void) {
int x=0;
char ch=getchar();
while(ch>'9' || ch<'0')ch=getchar();
while(ch>='0' && ch<='9')(x*=10)+=ch-'0',ch=getchar();
return x;
}
void add(int x,int y) {
line[++cnt].to=y;
line[cnt].next=head[x];
head[x]=cnt;
}
void tarjan(int x) {
dfn[x]=low[x]=++countt;
S.push(x);
vis[x]=1;
for(int i=head[x]; i; i=line[i].next) {
int to=line[i].to;
if(!dfn[to]) {
tarjan(to);
low[x]=min(low[to],low[x]);
} else if(vis[to]) {
low[x]=min(low[x],dfn[to]);
}
}
if(dfn[x]==low[x]) {
nn++;
int k=S.top();
while(k!=x) {
S.pop();
belong[k]=nn;
vis[k]=0;
minn[nn]=min(minn[nn],s[k]);
maxn[nn]=max(maxn[nn],s[k]);
k=S.top();
}
vis[k]=0;
S.pop(),belong[k]=nn;
minn[nn]=min(minn[nn],s[k]);
maxn[nn]=max(maxn[nn],s[k]);
}
}
void clear() {
cnt=0;
for(int i=1; i<=n; i++)head[i]=0;
for(int i=1; i<=2*m; i++)line[i].to=line[i].next=0;
}
void tuopo() {
queue<int>Q;
for(int i=1; i<=nn; i++) {
if(!in[i])Q.push(i);
}
while(!Q.empty()) {
int x=Q.front();
Q.pop();
for(int i=head[x]; i; i=line[i].next) {
int to=line[i].to;
deep[to]=min(deep[to],deep[x]);
in[to]--;
if(!in[to])Q.push(to);
}
}
}
int main() {
freopen("P1073_2.in","r",stdin);
n=get(),m=get();
for(int i=1; i<=n; i++) {
s[i]=get();
}
int c;
int k=0;
for(int i=1; i<=m; i++) {
a[i]=get(),b[i]=get(),c=get();
if(c==1)add(a[i],b[i]);
else add(a[i],b[i]),add(b[i],a[i]),k++;
}
int mm=m+k;
for(int i=1; i<=n; i++)minn[i]=900;
for(int i=1; i<=n; i++) {
if(!dfn[i])tarjan(i);
}
clear();
for(int i=1; i<=mm; i++) {
int from=a[i],to=b[i];
if(belong[from]!=belong[to])add(belong[from],belong[to]),in[belong[to]]++;
}
for(int i=1; i<=nn; i++)deep[i]=minn[i];
tuopo();
int ans=0;
for(int i=1; i<=nn; i++)ans=max(ans,maxn[i]-deep[i]);
printf("%d",ans);
}