#include <bits/stdc++.h>
using namespace std;
int n, m;
long long x[(1 << 17)];
struct edge {
  int v1, v2;
  long long w;
  edge(int tv1 = 0, int tv2 = 0, long long tw = 0) {
    v1 = tv1;
    v2 = tv2;
    w = tw;
  }
  void read() {
    cin >> v1 >> v2 >> w;
    v1--;
    v2--;
  }
  bool operator<(const edge& e) const { return w < e.w; }
};
edge e[(1 << 17)];
int v[(1 << 17)];
vector<pair<int, long long> > a[(1 << 17)];
pair<long long, long long> dfs(int cur) {
  v[cur] = 1;
  long long maxw = 0;
  long long sumv = x[cur];
  for (int i = 0; i < a[cur].size(); i++) {
    int nnext = a[cur][i].first;
    maxw = max(maxw, a[cur][i].second);
    if (!v[nnext]) {
      pair<long long, long long> p = dfs(nnext);
      maxw = max(maxw, p.first);
      sumv += p.second;
    }
  }
  return make_pair(maxw, sumv);
}
bool ok(int left) {
  for (int i = 0; i < (1 << 17); i++) {
    a[i].clear();
  }
  for (int i = 0; i < left; i++) {
    a[e[i].v1].push_back(make_pair(e[i].v2, e[i].w));
    a[e[i].v2].push_back(make_pair(e[i].v1, e[i].w));
  }
  memset(v, 0, sizeof(v));
  for (int i = 0; i < n; i++) {
    if (!v[i]) {
      pair<long long, long long> p = dfs(i);
      if (p.first > p.second) {
        return false;
      }
    }
  }
  return true;
}
int main() {
  cin >> n >> m;
  for (int i = 0; i < n; i++) {
    cin >> x[i];
  }
  for (int i = 0; i < m; i++) {
    e[i].read();
  }
  sort(e, e + m);
  int l = 0, r = m;
  if (ok(r)) {
    cout << 0 << endl;
    return 0;
  }
  while (r - l > 1) {
    int med = (l + r) / 2;
    if (ok(med)) {
      l = med;
    } else {
      r = med;
    }
  }
  cout << m - l << endl;
  return 0;
}
