#include<cstdio>
#include<vector>
#include<cstring>
#define MAXN 55
#define MAXNODES 5001
#define INF 100
using namespace std;
vector<pair<int,int> > edges[MAXN];
vector<int> g[MAXNODES+5];
int n,m,source=0,sink=MAXNODES,capital=1;
int seen[MAXNODES+5],dad[MAXNODES+5],Queue[MAXNODES+5];
char capacity[MAXNODES+5][MAXNODES+5];
void AddEdge(int a,int b,int c){
g[a].push_back(b);
g[b].push_back(a);
capacity[a][b]=c;
}
int minimum(int a,int b){
if(a<b)
return a;
return b;
}
bool BFS(){
int left=1,right=1,node,i;
memset(seen,0,sizeof(seen));
Queue[left]=source;
seen[source]=1;
while(left<=right){
node=Queue[left];
left++;
if(node==sink)
continue;
for(i=0;i<g[node].size();i++)
if(seen[g[node][i]]==0&&capacity[node][g[node][i]]>0){
seen[g[node][i]]=1;
dad[g[node][i]]=node;
right++;
Queue[right]=g[node][i];
}
}
if(seen[sink]==1)
return true;
return false;
}
int MaximumFlow(){
int i,answer=0,add,node;
while(BFS()==true)
for(i=0;i<g[sink].size();i++)
if(seen[g[sink][i]]==1&&capacity[g[sink][i]][sink]>0){
dad[sink]=g[sink][i];
add=INF;
for(node=sink;node!=source;node=dad[node])
add=minimum(add,capacity[dad[node]][node]);
for(node=sink;node!=source;node=dad[node]){
capacity[dad[node]][node]-=add;
capacity[node][dad[node]]+=add;
}
answer+=add;
}
return answer;
}
int main(){
freopen("algola.in","r",stdin);
freopen("algola.out","w",stdout);
int i,j,a,b,c,citizens,sum=0.,currentFlow,days=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&citizens);
sum+=citizens;
AddEdge(source,i,citizens);
}
for(i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
edges[a].push_back(make_pair(b,c));
edges[b].push_back(make_pair(a,c));
}
AddEdge(capital,sink,INF);
currentFlow=MaximumFlow();
while(currentFlow<sum){
days++;
for(i=1;i<=n;i++){
AddEdge((days-1)*n+i,days*n+i,INF);
for(j=0;j<edges[i].size();j++)
AddEdge((days-1)*n+i,days*n+edges[i][j].first,edges[i][j].second);
}
AddEdge(days*n+1,sink,INF);
currentFlow+=MaximumFlow();
}
printf("%d",days);
return 0;
}