#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template<class T> inline bool chmin(T&x,T y){if(x>y){x=y;return true;}return false;}
template<class T> inline bool chmax(T&x,T y){if(x<y){x=y;return true;}return false;}
#define fr(i,n) for(int i=0;i<(n);++i)
#define Fr(i,n) for(int i=1;i<=(n);++i)
#define ifr(i,n) for(int i=(n)-1;i>=0;--i)
#define iFr(i,n) for(int i=(n);i>0;--i)

struct UF{
    vector<int> par,sz,c;
    vector<ll> w;
    explicit UF(int n):par(n),sz(n,1),w(n),c(n){
        iota(par.begin(),par.end(),0);
        for(auto&i:w) cin>>i;
    }
    int find(int x){
        if(par[x]==x) return x;
        return par[x]=find(par[x]);
    }
    bool unit(int x, int y, int W){
        x=find(x);
        y=find(y);
        if(x==y){
            if(w[x]<W) ++c[x];
            return false;
        }
        if(sz[x]<sz[y]) swap(x,y);
        if((w[x]+=w[y])<W) c[x]+=c[y]+1;
        else c[x]=0;
        par[y]=x;
        sz[x]+=sz[y];
        return true;
    }
    bool same(int x, int y){return find(x)==find(y);}
};

struct edge{
    int a,b,w;
};

int main(){
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n,m;
    cin>>n>>m;
    UF uf(n);
    vector<edge> e(m);
    for(auto&E:e) cin>>E.a>>E.b>>E.w,--E.a,--E.b;
    sort(e.begin(),e.end(),[](const edge&a, const edge&b){
        return a.w<b.w;
    });
    for(auto&E:e) uf.unit(E.a,E.b,E.w);
    cout<<uf.c[uf.find(0)]<<endl;
}