#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#include <functional>
#include <set>
#include <map>
#define SIZE 100005

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;
typedef pair <int,P> PP;

struct UF
{
	int par[SIZE],rank[SIZE];
	ll sz[SIZE];
	int cnt[SIZE];
	
	void init(int n)
	{
		for(int i=0;i<n;i++)
		{
			par[i]=i;
			rank[i]=1;
			sz[i]=0;
		}
	}
	void ins(int v,ll x)
	{
		sz[v]=x;
	}
	int find(int x)
	{
		if(x==par[x]) return x;
		return par[x]=find(par[x]);
	}
	void unite(int x,int y)
	{
		x=find(x);
		y=find(y);
		if(x==y) return;
		if(rank[x]<rank[y])
		{
			par[x]=y;
			cnt[y]+=cnt[x];
			sz[y]+=sz[x];
		}
		else
		{
			par[y]=x;
			cnt[x]+=cnt[y];
			sz[x]+=sz[y];
			if(rank[x]==rank[y]) rank[x]++;
		}
	}
	void add(int v)
	{
		cnt[find(v)]++;
	}
	ll getsz(int v)
	{
		return sz[find(v)];
	}
	bool same(int x,int y)
	{
		return find(x)==find(y);
	}
}uf;
ll X[SIZE];
PP edge[SIZE];

int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++) scanf("%lld",&X[i]);
	for(int i=0;i<m;i++)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);a--,b--;
		edge[i]=PP(c,P(a,b));
	}
	sort(edge,edge+m);
	int ret=0;
	uf.init(n+2);
	for(int i=0;i<n;i++) uf.ins(i,X[i]);
	for(int i=0;i<m;i++)
	{
		P p=edge[i].second;
		uf.unite(p.first,p.second);
		uf.add(p.first);
		if(uf.getsz(p.first)>=edge[i].first)
		{
			int r=uf.find(p.first);
			ret+=uf.cnt[r];
			uf.cnt[r]=0;
		}
	}
	printf("%d\n",m-ret);
	return 0;
}
