#include <bits/stdc++.h>
using namespace std;
const int max_n = 100111, inf = 1000111222;
int v[max_n];
vector<pair<int, pair<int, int>>> e;
int sz[max_n];
int pr[max_n];
long long sumv[max_n];
long long cnte[max_n];
long long sete[max_n];
int n, m;
int get_set(int a) {
  if (pr[a] == a) {
    return a;
  } else {
    return get_set(pr[a]);
  }
}
int ans = 0;
void unite_set(int a, int b, int w) {
  int pra = get_set(a);
  int prb = get_set(b);
  if (pra == prb) {
    int pr = pra;
    if (w <= sumv[pr]) {
      ans++;
      cnte[pr]++;
      sete[pr]++;
      if (cnte[pr] != sete[pr]) {
        exit(228);
      }
    }
    return;
  }
  long long n_sumv = sumv[pra] + sumv[prb];
  long long n_cnte;
  long long n_sete;
  if (w <= n_sumv) {
    ans -= sete[pra];
    ans -= sete[prb];
    n_cnte = cnte[pra] + cnte[prb] + 1;
    n_sete = n_cnte;
    ans += n_cnte;
  } else {
    n_cnte = cnte[pra] + cnte[prb] + 1;
    n_sete = sete[pra] + sete[prb];
  }
  if (sz[pra] > sz[prb]) {
    sz[pra] += sz[prb];
    pr[prb] = pra;
    sumv[pra] = n_sumv;
    cnte[pra] = n_cnte;
    sete[pra] = n_sete;
  } else {
    sz[prb] += sz[pra];
    pr[pra] = prb;
    sumv[prb] = n_sumv;
    cnte[prb] = n_cnte;
    sete[prb] = n_sete;
  }
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; ++i) {
    cin >> v[i];
  }
  for (int i = 0; i < m; ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    --a, --b;
    e.push_back(make_pair(c, make_pair(a, b)));
  }
  for (int i = 0; i < n; ++i) {
    sz[i] = 1;
    pr[i] = i;
    sumv[i] = v[i];
    cnte[i] = sete[i] = 0;
  }
  sort(e.begin(), e.end());
  for (int i = 0; i < e.size(); ++i) {
    int a = e[i].second.first, b = e[i].second.second;
    int c = e[i].first;
    unite_set(a, b, c);
  }
  cout << (m - ans) << endl;
  return 0;
}
