#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;
const int nmax=100005;
struct edg
{
    int a,b,c;
}v[nmax];
long long sum[nmax],w[nmax];
int tt[2*nmax],rg[2*nmax],apm[nmax],mare[nmax],valid[nmax];
int n,m,i,j,ans,poz;
vector<int> ad[nmax];
bool comp(edg unu,edg doi)
{
    return unu.c<doi.c;
}
int finds(int x)
{
    while(x!=tt[x])
        x=tt[x];
    return x;
}
set<int> h[nmax];
set<int>::iterator it;
void unite(int A,int B)
{
    if(rg[A]<rg[B]) swap(A,B);
    tt[B]=A;ad[A].push_back(B);
    sum[A]+=sum[B];rg[A]+=rg[B];
    for(it=h[B].begin();it!=h[B].end();it++)
        h[A].insert(*it);
}
int main()
{
    //freopen("data.in","r",stdin);
    ios_base::sync_with_stdio(false);
    cin>>n>>m;
    for(i=1;i<=n;i++)
        cin>>w[i];
    for(i=1;i<=m;i++)
    {
        cin>>v[i].a>>v[i].b>>v[i].c;
    }
    sort(v+1,v+m+1,comp);
    for(i=1;i<=n;i++)
        sum[i]=w[i],tt[i]=i,rg[i]=1;
    for(i=1;i<=m;i++)
    {
        if(finds(v[i].a)!=finds(v[i].b))
        {
            unite(finds(v[i].a),finds(v[i].b));
            if(sum[finds(v[i].a)]>=1LL*v[i].c)
            {
                valid[i]=1;poz=finds(v[i].a);
                while(!h[poz].empty())
                {
                    valid[(*h[poz].begin())]=1;
                    h[poz].erase(h[poz].begin());
                }
            }
            else
            {
                h[finds(v[i].a)].insert(i);
            }
        }
    }
     for(i=1;i<=n;i++)
        sum[i]=w[i],tt[i]=i,rg[i]=1;
    for(i=1;i<=m;i++)
    {
        if(finds(v[i].a)!=finds(v[i].b)&&valid[i])
            unite(finds(v[i].a),finds(v[i].b));
    }
    long long sumtot;
    ans=m;
    for(i=1;i<=m;i++)
       if(finds(v[i].a)==finds(v[i].b)&&sum[finds(v[i].a)]>=v[i].c)
         ans--;
    cout<<ans;
    return 0;
}
