#include<bits/stdc++.h>
using namespace std;
const int N=100005;
struct edge{
	int u,v;
	long long w;
}e[N<<2];
int num[N],fa[N],cnt=0,n,m,ans=0;
long long sumw[N];
bool cmp(edge a,edge b){return a.w<b.w;}
void add_edge_information(int u,int v,long long w){e[++cnt]=(edge){u,v,w};}
int find(int u){return u==fa[u] ? u: fa[u]=find(fa[u]);}
void combine(int u,int v){
	fa[u]=v;
	sumw[v]+=sumw[u];
	num[v]+=num[u];
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&sumw[i]);
	int a,b;
	long long c;
	for(int i=1;i<=m;i++){
		scanf("%d%d%lld",&a,&b,&c);
		add_edge_information(a,b,c);
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++){
		int u=e[i].u,v=e[i].v;
		int fa1=find(u),fa2=find(v);
		if(fa1!=fa2) combine(fa1,fa2);
		num[fa2]++;
		if(sumw[fa2]>=e[i].w) ans+=num[fa2],num[fa2]=0;
	}
	printf("%d\n",m-ans);
} 