#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll,ll> pii;
typedef long double ld;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

const ll N = (ll)1e5 + 10;
const ll inf = (ll)1e18;
vector<pii> T[N];
ll vl[N];
int cnt[N];
int par[N];

int fin(int x){ 
  if(par[x]==x)return x;
  return par[x]=fin(par[x]);
}

void unite(int a, int b){
  a=fin(a);
  b=fin(b);
  if(a==b)return;
  par[a]=b;
  cnt[b]+=cnt[a];
  vl[b] += vl[a];
}

struct edge{
  int ai;
  int bi;
  ll wei;
  bool operator< (const edge &r) const {
    return wei < r.wei;
  }
};

int main(){
  fastIO;
  int n, m;
  cin >> n >> m;
  for(int i = 1; i <= n; i ++ ){
    cin >> vl[i];
    par[i]=i;
  }
  vector<edge> t(m);
  for(int i = 0 ; i < m ;i ++ ){
    cin >> t[i].ai >> t[i].bi >> t[i].wei;
  }
  sort(t.begin(), t.end());
  int ans = 0;
  for(int i = 0 ; i < m ; i ++ ){
    unite(t[i].ai, t[i].bi);
    cnt[fin(t[i].ai)] ++ ;
    if(vl[fin(t[i].ai)] >= t[i].wei){
      ans += cnt[fin(t[i].ai)];
      cnt[fin(t[i].ai)]=0;
    }
  }
  cout << m - ans << "\n";
  return 0;
}