#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define sz(x) (int)x.size()
#define mem(a) memset(a, 0, sizeof(a))
#define sqr(x) ((x) * (x))

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int mn = 1e5 + 5;
const int mod = 1e9 + 7;
#define P mod

int n,m;
int a[mn];
struct edge{
    int u,v,w;
    bool operator < (const edge &p) const{
        return w<p.w;
    }
}e[mn];

namespace dsu{
    int f[mn];
    ll sz[mn]; // 点权和
    int esz[mn]; // 边数
    void init(int n){
        for(int i=1;i<=n;i++) f[i]=i,sz[i]=a[i],esz[i]=0;
    }
    int sf(int x){
        if (f[x]==x) return x;
        if (sf(f[x])!=f[x]){
            f[x]=sf(f[x]);
        }
        return f[x];
    }
    void Union(int u,int v){
        u=sf(u),v=sf(v);
        if (u!=v){
            f[u]=v;
            sz[v]+=sz[u];
            esz[v]+=esz[u];
            sz[u]=esz[u]=0;
        }
        esz[v]++;
    }
}
using namespace dsu;

int main() {
#ifdef LOCAL
    freopen("../1.txt", "r", stdin);
#endif
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&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+m+1);
    init(n);
    int ans=m;
    for(int i=1;i<=m;i++){
        Union(e[i].u,e[i].v);
        int u=sf(e[i].u);
        if (sz[u]>=e[i].w) ans-=esz[u],esz[u]=0;
    }
    printf("%d\n",ans);
    return 0;
}
