/*
 * 	Just close your eyes
 * 		The sun is going down
 * 			You'll be alright...
 * 				No one can hurt you now
 * 					Come, morning light...
*/
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#ifndef rd
#define endl '\n'
#endif
#define deb cout<<"Line: "<<__LINE__<<" plz "
#define pb push_back
#define fi first
#define se second
#define int long long
typedef long long ll;
#define pii pair<int,int>
#define sz(x) ((int)x.size())
#define fr(a,b,c) for(int a=b; a<=c; a++)
#define all(con) con.begin(),con.end()
const ll inf=1e18;
const int mod=1e9+7;
typedef vector<int> vi;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
vector<int> gra[100005];
int dsu[100005];
int wei[100005];
int pend[100005];
vector<pair<int,pii>> edges;
int fpar(int i) {
	return (dsu[i]<0)?i:dsu[i]=fpar(dsu[i]);
}
void merge(int i, int j) {
	if((i=fpar(i))!=(j=fpar(j))) {
		pend[i]+=pend[j];
		wei[i]+=wei[j];
		dsu[i]+=dsu[j];
		dsu[j]=i;
	}
}
void solve()
{
	int n,m,u,v,w;
	cin>>n>>m;
	for(int i=1; i<=n; i++)
		dsu[i]=-1;
	int ans=0;
	for(int i=1; i<=n; i++) {
		cin>>wei[i];
	}
	for(int i=1; i<=m; i++) {
		cin>>u>>v>>w;
		edges.pb({w,{u,v}});
	}
	sort(all(edges));
	for(int i=0; i<m; i++) {
		merge(edges[i].se.fi,edges[i].se.se);
		int comp=fpar(edges[i].se.fi);
		pend[comp]++;
		if(wei[comp]>=edges[i].fi) {
			ans+=pend[comp];
			pend[comp]=0;
		}
	}
	cout<<m-ans<<endl;
}
signed main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	srand(chrono::steady_clock::now().time_since_epoch().count());
	auto clk=clock();
	int t=1;
//	cin>>t;
	while(t--)
		solve();
#ifdef rd
	cout<<endl<<endl<<(double)(clock()-clk)/CLOCKS_PER_SEC<<endl;
#endif
	return 0;
}