过了第一个点...
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
long long n,m,dfn[100005],low[100005],head1[100005],va[100005],belong[100005];
bool vis[100005];
long long tot1,tot2,sum,cnt,top,last,q[100005],head2[100005],ma[100005],mi[100005],ans[100005],in[100005];
struct node1{
long long from,next,to;
}t1[1000005];
struct node2{
long long next,to;
}t2[1000005];
void add1(long long x,long long y){
tot1++;
t1[tot1].next=head1[x];
head1[x]=tot1;
t1[tot1].from=x;
t1[tot1].to=y;
}
void add2(long long x,long long y){
tot2++;
t2[tot2].next=head2[x];
head2[x]=tot2;
t2[tot2].to=y;
}
void tj(long long u){
low[u]=dfn[u]=++sum;
q[++top]=u;vis[u]=true;
for(long long i=head1[u];i!=0;i=t1[i].next){
long long v=t1[i].to;
if(dfn[v]==0){
tj(v);
low[u]=min(low[u],low[v]);
}
else if(vis[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
cnt++;
long long x;
do{
x=q[top];top--;
belong[x]=cnt;vis[x]=false;
ma[cnt]=max(ma[cnt],va[x]);
mi[cnt]=min(mi[cnt],va[x]);
}while(x!=u);
ans[cnt]=ma[cnt]-mi[cnt];
}
}
void topo(){
memset(q,0,sizeof(q));top=0;last=1;
for(long long i=1;i<=cnt;i++){
if(in[i]==0)q[++top]=i;
}
while(last<=top){
long long u=q[last];
last++;ans[u]=ma[u]-mi[u];
for(long long i=head2[u];i!=0;i=t2[i].next){
long long v=t2[i].to;
mi[v]=min(mi[v],mi[u]);
in[v]--;
if(in[v]==0)q[++top]=v;
}
}
}
int main(){
cin>>n>>m;
memset(mi,1,sizeof(mi));
memset(low,1,sizeof(low));
for(long long i=1;i<=n;i++)cin>>va[i];
long long x,y,z;
for(long long i=1;i<=m;i++){
cin>>x>>y>>z;
add1(x,y);
if(z==2)add1(y,x);
}
for(long long i=1;i<=n;i++)if(dfn[i]==0)tj(i);
for(long long i=1;i<=tot1;i++){
x=t1[i].from;y=t1[i].to;
if(belong[x]!=belong[y]){
add2(belong[x],belong[y]);
in[belong[y]]++;
}
}
topo();
cout<<ans[belong[n]];
return 0;
}