#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int N=2e5+5;
struct edge
{
    int u,v,w;
    bool operator<(const edge&o)const
    {
        return w<o.w;
    }
}e[N];
int n,m,a[N];
stack<int>f[N];
int vis[N],dep[N];
ll sum[N];
int getf(int x){return f[x].top()==x?x:getf(f[x].top());}
void del(int x,ll s)
{
    sum[x]-=s;
    if(f[x].top()!=x) del(f[x].top(),s);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) f[i].push(i),sum[i]=a[i];
    for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
    sort(e+1,e+1+m);
    for(int i=1;i<=m;i++)
    {
       int fu=getf(e[i].u),fv=getf(e[i].v);
       if(fu==fv) continue;
       if(dep[fu]<dep[fv])
       {
           f[fu].push(fv);
           sum[fv]+=sum[fu];
           vis[i]=fu;
       }
       else
       {
           f[fv].push(fu);
           sum[fu]+=sum[fv];
           dep[fu]=max(dep[fv]+1,dep[fu]);
           vis[i]=fv;
       }
    }
    for(int i=m;i>=1;i--)
        if(vis[i])
        {
            int fu=getf(e[i].u);
            if(e[i].w>sum[fu])
            {
                del(f[vis[i]].top(),sum[vis[i]]);
                f[vis[i]].pop();
            }
        }
    int ans=0;
    for(int i=1;i<=m;i++)
    {
        int fu=getf(e[i].u),fv=getf(e[i].v);
        if(fu!=fv) continue;
        if(e[i].w<=sum[fu]) ans++;
    }
    printf("%d\n",m-ans);
}
