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

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) max((a),-(a))
#define rep(i,n) for(int i=0;i<(int)(n);i++)
#define repe(i,n) rep(i,(n)+1)
#define per(i,n) for(int i=(int)(n)-1;i>=0;i--)
#define pere(i,n) rep(i,(n)+1)
#define all(x) (x).begin(),(x).end()
#define SP <<" "<<
#define RET return 0
#define MOD 1000000007
#define INF 1000000000000000000

typedef long long LL;
typedef long double LD;

vector<pair<int,LL>> uf;

int root(int x){
  if(x==uf[x].first) return x;
  return uf[x].first=root(uf[x].first);
}

void uni(int x,int y){
  x=root(x);
  y=root(y);
  if(x==y) return;
  uf[x].first=y;
  uf[y].second+=uf[x].second;
}

int main(){
  int n,m;
  cin >> n >> m;
  vector<vector<pair<int,LL>>> e(n);
  uf=vector<pair<int,LL>>(n);
  for(int i=0;i<n;i++){
    uf[i].first=i;
    cin >> uf[i].second;
  }
  vector<pair<LL,pair<int,int>>> ve(m);
  vector<LL> tw(m);
  int a,b,y;
  for(int i=0;i<m;i++){
    cin >> a >> b >> y;
    a--,b--;
    e[a].push_back({b,y});
    e[b].push_back({a,y});
    ve[i]={y,{a,b}};
  }
  sort(all(ve));
  for(int i=0;i<m;i++){
    int x=root(ve[i].second.first);
    int y=root(ve[i].second.second);
    if(x==y) tw[i]=uf[x].second;
    else tw[i]=uf[x].second+uf[y].second;
    uni(x,y);
  }
  vector<int> c(n,-1);
  int ans=0;
  queue<int> bfs;
  int now;
  for(int i=m-1;i>=0;i--){
    if(c[ve[i].second.first]!=-1&&c[ve[i].second.first]==c[ve[i].second.second]) continue;
    if(tw[i]>=ve[i].first){
      c[ve[i].second.first]=c[ve[i].second.second]=i;
      bfs.push(ve[i].second.first);
      bfs.push(ve[i].second.second);
      while(!bfs.empty()){
        now=bfs.front();
        bfs.pop();
        for(auto &p:e[now]){
          if(c[p.first]==-1&&p.second<=ve[i].first){
            c[p.first]=i;
            bfs.push(p.first);
          }
        }
      }
    }else{
      ans++;
    }
  }
  cout << ans << endl;
  return 0;
}
