#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;
}
struct UF {
  vector<int> par, sz, w, c;
  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;
}
