#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=1007;
int i,j,k,l,t,n,m,ans,S,T;
int first[maxn*maxn],next[maxn*maxn],last[maxn*maxn],chang[maxn*maxn];
int p[maxn*maxn],a[maxn][maxn],f[maxn][maxn],d[maxn],fan[maxn*maxn],num;
int data[maxn*maxn],b[maxn*maxn],c[maxn*maxn],dd[maxn*maxn],dis[maxn*maxn];
void add(int x,int y,int z){
last[++num]=y;
next[num]=first[x];
first[x]=num;
chang[num]=z;
fan[num]=num+1;
last[++num]=x;
next[num]=first[y];
first[y]=num;
chang[num]=0;
fan[num]=num-1;
}
bool bfs(){
int head=0,tail=1,now,i,ber;
memset(data,0,sizeof(data));
memset(d,0,sizeof(d));d[S]=1;
ber=d[0];
data[1]=S;
while(head<tail){
now=data[++head];
for(i=first[now];i;i=next[i]){
if(!d[last[i]]&&chang[i]>0){
d[last[i]]=d[now]+1;
data[++tail]=last[i];
}
}
}
return d[T]!=0;
}
int dinic(int x,int y){
int i,j,k=0,l=0;
if(x==T){
return y;
}
for(i=first[x];i;i=next[i]){
if(d[x]+1==d[last[i]]&&chang[i]>0){
if(chang[i]>y)k=dinic(last[i],y);
else k=dinic(last[i],chang[i]);
if(k){
l+=k;
chang[i]-=k;chang[fan[i]]+=k;
y-=k;
if(y==0)break;
}
}
}
if(l==0)d[x]=-1;
return l;
}
int main(){
freopen("flight.in","r",stdin);
freopen("flight.out","w",stdout);
scanf("%d%d",&n,&m);
fo(i,1,n)scanf("%d",&p[i]);
S=0,T=2*m+1;
memset(f,127,sizeof(f));
fo(i,1,n)fo(j,1,n){
scanf("%d",&a[i][j]);
if(i==j)f[i][j]=a[i][j];
else f[i][j]=a[i][j]+p[j];
}
fo(k,1,n){
fo(i,1,n){
fo(j,1,n){
if(i==j)continue;
if(f[i][k]+f[k][j]<f[i][j]){
f[i][j]=f[i][k]+f[k][j];
}
}
}
}
fo(i,1,m){
scanf("%d%d%d",&b[i],&c[i],&dd[i]);
add(S,i,1);add(i+m,T,1);
}
fo(i,1,m){
fo(j,1,m){
if(i==j)continue;
if(dd[i]+a[b[i]][c[i]]+p[c[i]]+f[c[i]][b[j]]<=dd[j]){
add(i,j+m,1);
}
}
}
ans=m;
while(bfs())ans-=dinic(S,0x7fffffff);
printf("%d\n",ans);
}