#include<bits/stdc++.h>
#define N 500005
#define TOR (1<<30)
using namespace std;
int D[N],F[N],M[N];
int ans[N];
int dfn[N],low[N],in_stack[N],dfncnt;
int scc[N],sc,sz[N];
stack<int> s;
struct gra{
vector<int> E[N],V[N];
int R[N],C[N],n,m;
int vis[N];
void add_edge(int s,int e,int v){
E[s].push_back(e);
C[s]++;
R[e]++;
V[s].push_back(v);
}
}ma,wma;
void dfs(int u){
low[u] = dfn[u] = ++dfncnt,in_stack[u] = 1;
s.push(u);
for (int i=0; i<ma.E[u].size();i++){
const int &v = ma.E[u][i];
if (!dfn[v]) {
dfs(v);
low[u] = min(low[u], low[v]);
} else if (in_stack[v]) {
low[u] = min(low[u], dfn[v]);
}
}
if (dfn[u] == low[u]) {
++sc;
while (s.top() != u) {
scc[s.top()] = sc;
sz[sc]++;
in_stack[s.top()] = 0;
s.pop();
}
scc[s.top()] = sc;
sz[sc]++;
in_stack[s.top()] = 0;
s.pop();
}
}
int Dfsmax(int u){
int tans=F[u];
for (int j=0; j<wma.E[u].size();j++){
tans=max(Dfsmax(wma.E[u][j]),tans);
}
ans[u]=tans-M[u];
return tans;
}
int main(){
for(int i=1;i<=N;i++){
F[i]=-1,M[i]=1000000000;
}
scanf("%d%d",&ma.n,&ma.m);
for(int i=1;i<=ma.n;i++){
scanf("%d",&D[i]);
}
for(int i=1;i<=ma.m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
ma.add_edge(x,y,1);
if(z>1) {
ma.add_edge(y,x,1);;
}
}
for(int i=1;i<=ma.n;i++){
if(scc[i]==0){
dfs(i);
}
}
wma.n=sc;
for(int i=1;i<=ma.n;i++){
for (int j=0; j<ma.E[i].size();j++){
wma.add_edge(scc[i],ma.E[i][j],1);
F[scc[i]]=max(F[scc[i]],D[i]);
M[scc[i]]=min(M[scc[i]],D[i]);
}
}
Dfsmax(1);
int t=0;
for(int i=1;i<=wma.n;i++){
t=max(t,ans[i]);
}
printf("%d",t);
return 0;
}