1 /**************************************************************
2 Problem: 1497
3 User: Doggu
4 Language: C++
5 Result: Accepted
6 Time:700 ms
7 Memory:10196 kb
8 ****************************************************************/
9
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13 template<class T>inline void readin(T &res) {
14 static char ch;
15 while((ch=getchar())<‘0‘||ch>‘9‘);
16 res=ch-48;
17 while((ch=getchar())>=‘0‘&&ch<=‘9‘)res=(res<<1)+(res<<3)+ch-48;
18 }
19 const int N = 100000;
20 const int M = 500000;
21 struct Edge {int v,upre,cap,flow;}g[M];
22 int head[N], ne=-1;
23 inline void adde(int u,int v,int cap) {
24 g[++ne]=(Edge){v,head[u],cap,0},head[u]=ne;
25 g[++ne]=(Edge){u,head[v],0,0},head[v]=ne;
26 }
27
28 int n, m, s, t;
29
30 int d[N], cur[N], q[N], front, rear;
31 bool BFS() {
32 memset(d, 0,sizeof(d));
33 front=rear=0;q[rear++]=s;d[s]=1;
34 while(front!=rear) {
35 int u=q[front++];
36 for( int i = head[u]; i != -1; i = g[i].upre ) {
37 int v=g[i].v;
38 if(!d[v]&&g[i].cap>g[i].flow) q[rear++]=v,d[v]=d[u]+1;
39 }
40 }
41 return d[t];
42 }
43 int DFS(int u,int a) {
44 if(u==t||a==0) return a;
45 int flow=0, f;
46 for( int &i = cur[u]; i != -1; i = g[i].upre ) {
47 int v=g[i].v;
48 if(d[v]==d[u]+1&&(f=DFS(v,std::min(a,g[i].cap-g[i].flow)))>0) {
49 flow+=f;a-=f;g[i].flow+=f;g[i^1].flow-=f;
50 if(a==0) break;
51 }
52 }
53 if(!flow) d[u]=0;
54 return flow;
55 }
56 int maxflow() {
57 int flow=0;
58 while(BFS()) {
59 memcpy(cur,head,sizeof(head));
60 flow+=DFS(s,0x3f3f3f3f);
61 }
62 return flow;
63 }
64 int main() {
65 memset(head,-1,sizeof(head));
66 readin(n);readin(m);
67 int x, a, b, c, sum=0;
68 s=n+m+1;t=n+m+2;
69 for( int i = 1; i <= n; i++ ) {
70 readin(x);adde(i,t,x);
71 }
72 for( int i = 1; i <= m; i++ ) {
73 readin(a);readin(b);readin(c);sum+=c;
74 adde(n+i,a,0x3f3f3f3f);
75 adde(n+i,b,0x3f3f3f3f);
76 adde(s,n+i,c);
77 }
78 n=n+m+2;
79 //净获利=获益之和-投入成本之和(要么放弃c要么投入ab)
80 printf("%d\n",sum-maxflow());
81 return 0;
82 }