#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
typedef std::pair<int,int> P;
const int N=1e5+5;
struct Edge {
    int u,v,c;
    bool operator < (const Edge &b) const {
        return c<b.c;
    }
    void input() {
        scanf("%d%d%d",&u,&v,&c);
    }
}e[N];bool vis[N];
int n,m,par[N],a[N],rank[N];long long sum[N];
void init() {
    for(int i=1;i<=n;i++) par[i]=i,sum[i]=a[i],rank[i]=0;
}
int fd(int x) {
    while(x!=par[x]) x=par[x];
    return x;
}
std::vector<P> ans;
void unite(int x,int y) {
    x=fd(x);y=fd(y);
    if(x==y) return;
    if(rank[x]>rank[y]) std::swap(x,y);
    ans.push_back(P(x,y));
    par[x]=y;
    sum[y]+=sum[x];
    if(rank[x]==rank[y]) rank[y]++;
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",a+i);
    for(int i=0;i<m;i++) e[i].input();
    init();std::sort(e,e+m);
    int tot=0;
    for(int i=0;i<m;i++) {
        int u=fd(e[i].u),v=fd(e[i].v);
        if(u==v) continue;
        tot++;vis[i]=1;
        unite(u,v);
    }
    int now=n-2;
    for(int i=m-1;~i;i--) if(vis[i]) {
        int u=fd(e[i].u);
        if(e[i].c>sum[u]) {
            tot--;
            int x=ans[now].first,y=ans[now].second;
            sum[y]-=sum[x];
            par[x]=x;
        }
        --now;
    }
    for(int i=0;i<m;i++) if(!vis[i]) {
        int u=fd(e[i].u),v=fd(e[i].v);
        if(u!=v) continue;
        if(sum[u]>=e[i].c) tot++;
    }
    printf("%d\n",m-tot);
    return 0;
}
