// Ilie "The-Winner" Dumitru
// Dumnezeu sa o ierte
#include<bits/stdc++.h>
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(), (x).end()
#define err(...) fprintf(stderr, __VA_ARGS__)
using ll=long long;
constexpr int NMAX=50;
constexpr ll MOD=1000000007;
template<class F> constexpr F inf()
{ return std::numeric_limits<F>::max(); }
template<class F=ll> struct Dinic {
struct Edge { int to, rev; F c, oc; F flow() {
return std::max(oc-c, (F)0); } /* if you need flows */ };
std::vector<int> lvl, ptr, q;
std::vector<std::basic_string<Edge> > adj;
Dinic(int n) : lvl(n), ptr(n), q(n), adj(n) {}
void addEdge(int a, int b, F c, F rcap=0) {
adj[a].push_back({b, sz(adj[b]), c, c});
adj[b].push_back({a, sz(adj[a])-1, rcap, rcap}); }
F dfs(int v, int t, F f) { if(v==t || !f) return f;
for(int& i=ptr[v];i<sz(adj[v]);i++) { Edge& e=adj[v][i];
if(lvl[e.to]==lvl[v]+1)
if(F p=dfs(e.to, t, std::min(f, e.c))) {
e.c-=p, adj[e.to][e.rev].c+=p; return p; }
} return 0; }
F calc(int s, int t) { F flow=0; q[0]=s;
do { lvl=ptr=std::vector<int>(sz(q));
int qi=0, qe=lvl[s]=1; while(qi<qe && !lvl[t]) {
int v=q[qi++]; for(Edge e : adj[v])
if(!lvl[e.to] && e.c)
q[qe++]=e.to, lvl[e.to]=lvl[v]+1; }
while(F p=dfs(s, t, inf<F>())) flow+=p; } while(lvl[t]);
return flow; }
bool leftOfMinCut(int a) { return lvl[a]!=0; } };
struct edge
{
int u, v, c;
};
int N, M;
int src[NMAX];
std::vector<edge> E;
bool doable(int days)
{
int s=N*(days+1), i, j, sum=0;
Dinic D(s+1);
for(i=0;i<N;++i)
if(src[i])
{
D.addEdge(s, i, src[i]);
sum+=src[i];
}
for(i=0;i<days;++i)
{
for(j=0;j<N;++j)
D.addEdge(i*N+j, i*N+N+j, 50);
for(j=0;j<M;++j)
{
D.addEdge(i*N+E[j].u, i*N+N+E[j].v, E[j].c);
D.addEdge(i*N+E[j].v, i*N+N+E[j].u, E[j].c);
}
}
return D.calc(s, N*days)==sum;
}
int main()
{
FILE* f=fopen("algola.in", "r"), *g=fopen("algola.out", "w");
int a, b, c, i, l, r, mid;
fscanf(f, "%d%d", &N, &M);
for(i=0;i<N;++i)
fscanf(f, "%d", src+i);
for(i=0;i<M;++i)
{
fscanf(f, "%d%d%d", &a, &b, &c);
E.push_back({--a, --b, c});
}
for(l=-1, r=255;r-l>1;)
{
mid=l+((r-l)>>1);
if(doable(mid))
r=mid;
else
l=mid;
}
fprintf(g, "%d\n", r);
fclose(f);
fclose(g);
return 0;
}