#include<iostream>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<map>
#include<list>
#include<stack>
#include<cctype>
#include<cstdlib>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
return x*f;
}
queue<int>q;
struct node{
int v,nxt,w;
}e[3000001];
int head[3000001],ejs;
void add(int u,int v,int w){
e[++ejs].v=v;
e[ejs].nxt=head[u];
head[u]=ejs;
e[ejs].w=w;
}
int a[3000001],vis[3000001],dis[3000001];
void spfa(int u){
memset(dis,-0x3f,sizeof(dis));
dis[u]=0;
q.push(u);
while(!q.empty()){
int u=q.front();q.pop();
//cout<<u<<endl;
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
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(){
int n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
add(i,i+n,-a[i]);
add(i+n,i+n+n,a[i]);
}
for(int i=1;i<=n;i++){
int u=read(),v=read(),opt=read();
add(u,v,0);
add(u+n,v+n,0);
add(u+n+n,v+n+n,0);
if(opt==2){
add(v,u,0);
add(v+n,u+n,0);
add(v+n+n,u+n+n,0);
}
}
spfa(1);
cout<<dis[3*n];
return 0;
}
T*3,A了一个点,其他都是WA