/*DavitMarg*/
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
#include <iomanip>
#include <stack>
#include <cassert>
#include <iterator>
#include <bitset>
#include <fstream>
#define mod 998244353ll
#define LL long long
#define LD long double
#define MP make_pair
#define PB push_back
#define all(v) v.begin(),v.end()
using namespace std;

struct edge
{
	int a,b;
	LL w;
	edge(int A=0,int B=0,LL W=0)
	{
		a=A;
		b=B;
		w=W;
	}
};

bool operator<(edge a,edge b)
{
	return a.w<b.w;
}



int n,m;
int parent[100005],cnt[100005],bad[100005],ans;
LL sum[100005];
vector<edge> p;

int getParent(int v)
{
	if(parent[v]==v)
		return v;
	return parent[v]=getParent(parent[v]);
}

void dsu(int a,int b)
{
	a=getParent(a);
	b=getParent(b);
	if(a==b)
		return;
	if(cnt[a]<cnt[b])
		swap(a,b);
	sum[a]+=sum[b];
	cnt[a]+=cnt[b];
	bad[a]+=bad[b];
	parent[b]=a;
}

int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		parent[i]=i;
		cnt[i]=1;
		scanf("%lld",sum+i);
	}
	while(m--)
	{
		p.PB(edge());
		scanf("%d%d%lld",&p.back().a,&p.back().b,&p.back().w);
	}

	sort(all(p));
	for(int i=0;i<p.size();i++)
	{
		if(getParent(p[i].a)==getParent(p[i].b))
		{
			if(sum[getParent(p[i].a)]<p[i].w)
				bad[getParent(p[i].a)]++;
		}
		else
		{
			if( sum[getParent(p[i].a)] + sum[getParent(p[i].b)] >= p[i].w)
			{
				bad[getParent(p[i].a)]=0;
				bad[getParent(p[i].b)]=0;
			}
			else
				bad[getParent(p[i].a)]++;			
			dsu(p[i].a,p[i].b);
		}
		
	}

	for(int i=2;i<=n;i++)
		dsu(i,1);
	cout<<bad[getParent(1)]<<endl;
	return 0;
}
 
/*





*/