#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int a, b, y;
};
class UnionFind {
 public:
  explicit UnionFind(int n) : data_(n, -1) {}
  int root(int i) { return (data_[i] >= 0) ? (data_[i] = root(data_[i])) : i; }
  void unify(int i, int j) {
    i = root(i);
    j = root(j);
    if (i == j) return;
    if (-data_[i] >= -data_[j]) {
      data_[i] += data_[j];
      data_[j] = i;
    } else {
      data_[j] += data_[i];
      data_[i] = j;
    }
  }

 private:
  vector<int> data_;
};
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  vector<int> x(n);
  for (int i = 0; i < n; i++) scanf("%d", &x[i]);
  vector<Edge> e(m);
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].y);
    --e[i].a;
    --e[i].b;
  }
  int m0 = m;
  while (true) {
    int m_old = m;
    UnionFind uf(n);
    for (int i = 0; i < m; i++) uf.unify(e[i].a, e[i].b);
    vector<int> v(n, 0);
    for (int i = 0; i < n; i++) v[uf.root(i)] += x[i];
    for (int i = 0; i < m; i++) {
      if (e[i].y > v[uf.root(e[i].a)]) {
        e[i] = e[--m];
        --i;
      }
    }
    if (m == m_old) break;
  }
  printf("%d\n", m0 - m);
  return 0;
}
