#include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #define M 1000010 #define INF 0x3f3f3f3f using namespace std; int m,n,cnt; int head[M*3],dis[M],v[M]; bool vis[M]; struct edge{ int to,nxt,w; }e[M*3]; queue<int> Q; void Add(int x,int y){ cnt++; e[cnt].to=y; e[cnt].nxt=head[x]; e[cnt].w=0; head[x]=cnt; cnt++; e[cnt].to=y+n; e[cnt].nxt=head[x+n]; e[cnt].w=0; head[x+n]=cnt; cnt++; e[cnt].to=y+2*n; e[cnt].nxt=head[x+2*n]; e[cnt].w=0; head[x+2*n]=cnt; cnt++; e[cnt].to=y+n; e[cnt].nxt=head[x]; e[cnt].w=-v[y]; head[x]=cnt; cnt++; e[cnt].to=y+2*n; e[cnt].nxt=head[x+n]; e[cnt].w=v[y]; head[x+n]=cnt; } void Spfa(){ memset(dis,-INF,sizeof(dis)); dis[1]=0; vis[1]=1; Q.push(1); while(!Q.empty()){ int u=Q.front(); Q.pop(); vis[u]=0; for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; if(dis[v]<dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; if(!vis[v]){ Q.push(v); vis[v]=1; } } } } } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&v[i]); for(int i=1;i<=m;i++){ int x,y,z; scanf("%d%d%d",&x,&y,&z); Add(x,y); if(z==2) Add(y,x); } Spfa(); printf("%d\n",dis[3*n]>0?dis[3*n]:0); return 0; }