#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,m;
long x[1<<17];
struct UF{
	int n;
	vector<int>parent,rank,cnt;
	vector<long>w;
	UF(int n_=0):n(n_),parent(n_),rank(n_,0),w(n_),cnt(n_,0)
	{
		for(int i=0;i<n_;i++)
		{
			parent[i]=i;
			w[i]=x[i];
		}
	}
	int find(int a)
	{
		return parent[a]!=a?parent[a]=find(parent[a]):a;
	}
	bool same(int a,int b)
	{
		return find(a)==find(b);
	}
	bool unite(int a,int b)
	{
		a=find(a),b=find(b);
		if(a==b)return false;
		if(rank[a]<rank[b])
		{
			parent[a]=b;
			w[b]+=w[a];
			cnt[b]+=cnt[a];
		}
		else
		{
			parent[b]=a;
			w[a]+=w[b];
			cnt[a]+=cnt[b];
			if(rank[a]==rank[b])rank[a]++;
		}
		return true;
	}
};
int main()
{
	cin>>n>>m;
	for(int i=0;i<n;i++)cin>>x[i];
	UF uf(n);
	vector<pair<long,pair<int,int> > >G;
	for(int i=0;i<m;i++)
	{
		long y;int u,v;cin>>u>>v>>y;
		G.push_back(make_pair(y,make_pair(u-1,v-1)));
	}
	sort(G.begin(),G.end());
	for(int i=0;i<m;i++)
	{
		uf.unite(G[i].second.first,G[i].second.second);
		int u=uf.find(G[i].second.first);
		if(uf.w[u]<G[i].first)uf.cnt[u]++;
		else uf.cnt[u]=0;
	}
	int ans=0;
	for(int i=0;i<n;i++)if(i==uf.find(i))ans+=uf.cnt[i];
	cout<<ans<<endl;
}