#include <iostream> #include <algorithm> #include <queue> using namespace std; const int N(100009); struct node{ node *next; int no; }; node* g[N]={0}; node* g2[N]={0}; int pri[N]={0},Bmin[N]={0},Smax[N]={0}; bool inq[N]={false}; queue<int> q; void spfab(int x) { Bmin[x]=pri[x]; q.push(x); inq[x]=true; while(!q.empty()) { int x(q.front()); q.pop(); inq[x]=false; node *p(g[x]); while(p) { if(min(Bmin[x],pri[p->no])<Bmin[p->no]) { Bmin[p->no]=min(Bmin[x],pri[x]); if(!inq[p->no]) { q.push(p->no); inq[p->no]=true; } } p=p->next; } } } void spfas(int x) { Smax[x]=pri[x]; q.push(x); inq[x]=true; while(!q.empty()) { int x(q.front()); q.pop(); inq[x]=false; node *p(g2[x]); while(p) { if(max(pri[p->no],Smax[x])>Smax[p->no]) { Smax[p->no]=max(pri[p->no],Smax[x]); if(!inq[p->no]) { q.push(p->no); inq[p->no]=true; } } p=p->next; } } } int main() { int n,m,ans(0); cin>>n>>m; for(int i=1;i<=n;i++) cin>>pri[i]; int x,y,z;node *p; for(int i=1;i<=m;i++) { cin>>x>>y>>z; p=new(node);p->next=g[x];g[x]=p;p->no=y; p=new(node);p->next=g2[y];g2[y]=p;p->no=x; if(z==2) { p=new(node);p->next=g[y];g[y]=p;p->no=x; p=new(node);p->next=g2[x];g2[x]=p;p->no=y; } } fill(Bmin,Bmin+N,0x7fffffff); spfab(1); fill(inq,inq+N,false); spfas(n); for(int i=1;i<=n;i++) ans=max(ans,Smax[i]-Bmin[i]); cout<<ans<<endl; return 0; } /************************************************************** Problem: 2290 User: admin Language: C++ Result: Accepted Time:555 ms Memory:14412 kb ****************************************************************/