#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
#define minim(a,b) (a<b ? a : b)
#define INF 1000000005
#define NMAX 10005
#define pb push_back
vector<int> g[NMAX];
vector<int> v[NMAX];
int pred[NMAX],n,nr;
int q[NMAX],h[NMAX];
int cap[2012][2012];
int flux[2012][2012];
int sum,sol,m;
char viz[NMAX];
int bfs()
{
int i,lim,inc,sf,vec,nod;
memset(pred,-1,sizeof(pred));
memset(viz,0,sizeof(viz));
memset(q,0,sizeof(q));
q[inc=1]=0;sf=1;
viz[0]=1;
while(inc<=sf)
{
nod=q[inc];
lim=v[nod].size();
for(i=0;i<lim;i++)
{
vec=v[nod][i];
if(!viz[vec] && flux[nod][vec]<cap[nod][vec])
{
viz[vec]=1;
pred[vec]=nod;
q[++sf]=vec;
}
}
inc++;
}
return viz[nr-n+1];
}
void build_graph()
{
int i,j,lim;
for(i=1;i<=n;i++)
{
lim=g[i].size();
for(j=0;j<lim;j++)
{
// printf("MUchie intre %d si %d cu capacitate %d\n",i+nr-n,nr+g[i][j],cap[i][g[i][j]]);
v[i+nr-n].pb(g[i][j]+nr);
v[g[i][j]+nr].pb(i+nr-n);
cap[i+nr-n][g[i][j]+nr]=cap[i][g[i][j]];
}
//printf("Mchie intre %d si %d cu capacitate %d\n",i+nr-n,i+nr,INF);
v[i+nr-n].pb(i+nr);
v[i+nr].pb(i+nr-n);
cap[i+nr-n][i+nr]=INF;
}
}
int main ()
{
int i,a,b,c,val,t;
freopen("algola.in","r",stdin);
freopen("algola.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&h[i]);
sum+=h[i];
v[0].pb(i);
v[i].pb(0);
cap[0][i]=h[i];
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
g[a].pb(b);
g[b].pb(a);
cap[a][b]=c;
cap[b][a]=c;
}
nr=n;
for(t=1;1;t++)
{
build_graph();
nr+=n;
while(bfs())
{
val=INF;
for(i=nr-n+1;pred[i]!=-1;i=pred[i])
val=minim(val,cap[pred[i]][i]-flux[pred[i]][i]);
sol+=val;
for(i=nr-n+1;pred[i]!=-1;i=pred[i])
{
flux[pred[i]][i]+=val;
flux[i][pred[i]]-=val;
}
}
if(sol==sum)
{
printf("%d\n",t);
break;
}
}
return 0;
}