#include <bits/stdc++.h>
using namespace std;

struct UnionFind{
    vector<int> par, sz, cnt;
    vector<long long> sum;
    UnionFind(){}
    UnionFind(int n):par(n), sz(n, 1), cnt(n), sum(n){
        iota(par.begin(), par.end(), 0);
    }
    int find(int x){
        if(x == par[x]) return x;
        return par[x] = find(par[x]);
    }
    void unite(int x, int y){
        x = find(x); y = find(y);
        if(x == y) return;
        if(sz[x] < sz[y]) swap(x, y);
        sz[x] += sz[y];
        cnt[x] += cnt[y];
        sum[x] += sum[y];
        par[y] = x;
    }
    bool same(int x, int y){
        return find(x) == find(y);
    }
};

struct edge{
    int u, v, w;
    bool operator<(const edge &e)const{
        return w < e.w;
    }
};

int main(){
    int n, m, ans = 0;
    cin >> n >> m;
    UnionFind uf(n);
    for(int i = 0; i < n; i++){
        int x;
        cin >> x;
        uf.sum[i] = x;
    }
    vector<edge> es(m);
    for(int i = 0; i < m; i++){
        int a, b, y;
        cin >> a >> b >> y;
        es[i] = {a - 1, b - 1, y};
    }
    sort(es.begin(), es.end());
    for(auto e : es){
        if(!uf.same(e.u, e.v)){
            uf.unite(e.u, e.v);
        }
        int p = uf.find(e.u);
        if(uf.sum[p] >= e.w){
            ans += uf.cnt[p] + 1;
            uf.cnt[p] = 0;
        }else{
            uf.cnt[p]++;
        }
    }
    cout << m - ans << endl;
}