#include<bits/stdc++.h>
#define int long long
#define maxn 400005
using namespace std;
const int inf=1e18;
template<class T>
inline T read(){
T r=0,f=0;
char c;
while(!isdigit(c=getchar()))f|=(c=='-');
while(isdigit(c))r=(r*10)+(c^48),c=getchar();
return f?-r:r;
}
int n,m,s,t,p[maxn],diannum;
struct E{
int Next,to,w;
}edge[maxn<<1];
int cnt=1,head[maxn];
int hu[maxn],level[maxn];
inline void addedge(int from,int to,int w){
edge[++cnt]={head[from],to,w};
head[from]=cnt;
}
inline bool bfs(){
queue<int>q;
for(int i=s;i<=t;i++)level[i]=0;
q.push(s),level[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
hu[u]=head[u];
for(int i=head[u];i;i=edge[i].Next){
int to=edge[i].to,w=edge[i].w;
if(w&&!level[to]){
level[to]=level[u]+1;
q.push(to);
if(to==t)return true;
}
}
}
return false;
}
int sum=0,ans=0;
int dinic(int u,int flow){
if(u==t)return flow;
int rest=flow;
for(int &i=hu[u];i;i=edge[i].Next){
int to=edge[i].to,w=edge[i].w;
if(w&&level[to]==level[u]+1){
int increase=dinic(to,min(rest,edge[i].w));
if(!increase)level[to]=0;
edge[i].w-=increase;
edge[i^1].w+=increase;
rest-=increase;
if(!rest)break;
}
}
return flow-rest;
}
signed main(){
// freopen("sol.in","r",stdin);
n=read<int>(),m=read<int>();
for(int i=1;i<=n;i++){
p[i]=read<int>();
}
s=0,t=n+m+1;
for(int i=1;i<=n;i++){
addedge(i,t,p[i]);
addedge(t,i,0);
}
diannum=n;
for(int i=1;i<=m;i++){
int u=read<int>();
int v=read<int>();
int c=read<int>();
addedge(s,++diannum,c);
addedge(diannum,s,0);
addedge(diannum,u,inf);
addedge(u,diannum,0);
addedge(diannum,v,inf);
addedge(v,diannum,0);
sum+=c;
}
while(bfs())ans+=dinic(s,1e18);
printf("%lld\n",sum-ans);
return 0;
}
不知道哪里挂了