#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int f[N],g[N],he[N],ne[N*2],t[N*2],a[N],p[N],tot=0;
long long sum[N];
struct aa
{
	int u,v,c;
}e[N];
bool cmp(aa x,aa y)
{
	return x.c<y.c;
}
int get(int x)
{
	if (f[x]==x) return x;
	return f[x]=get(f[x]);
}
void add(int x,int y)
{
	tot++;
	ne[tot]=he[x];
	he[x]=tot;
	t[tot]=y;
}
void flow(int x)
{
	for (int i=he[x];i;i=ne[i]) 
	{
		if (!p[t[i]]) p[t[i]]=p[x];
		flow(t[i]);
	}
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for (int i=1;i<=n;i++) scanf("%lld",&a[i]),f[i]=i,sum[i]=a[i];
	for (int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].c);
	sort(e+1,e+m+1,cmp);
	for (int i=1;i<=m;i++) 
	{
		int xx=get(e[i].u),yy=get(e[i].v);
		if (xx!=yy)
		{
			if (sum[xx]+sum[yy]>=e[i].c) p[i]=1;
			f[xx]=yy;
			sum[yy]=sum[yy]+sum[xx];
			if (g[xx]) add(i,g[xx]);
			if (g[yy]) add(i,g[yy]);
			g[yy]=i;
		}
	}
	int rt=get(1);
	flow(g[rt]);
	for (int i=1;i<=n;i++) f[i]=i,sum[i]=a[i];
	for (int i=1;i<=m;i++) if (p[i]) sum[get(e[i].v)]+=sum[get(e[i].u)],f[get(e[i].u)]=get(e[i].v);
	int ans=m;
	for (int i=1;i<=m;i++) if (get(e[i].u)==get(e[i].v)&&sum[get(e[i].u)]>=e[i].c) ans--;
	printf("%d\n",ans);
}