#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v;
  long long c;
  edge() {}
  edge(int uu, int vv, long long cc) {
    u = uu;
    v = vv;
    c = cc;
  }
  bool operator<(const edge &e) const { return c < e.c; }
};
int ngsum = 0;
int pl = 0;
struct uftree {
  int par[200005];
  int rank[200005];
  long long sum[200005];
  long long maxi[200005];
  int ng[200005];
  uftree() {}
  void init(int n) {
    for (int i = 0; i < n; i++) {
      par[i] = i;
      rank[i] = 0;
      maxi[i] = 0;
      sum[i] = 0;
      ng[i] = 0;
    }
  }
  int find(int x) {
    if (par[x] == x) return x;
    return par[x] = find(par[x]);
  }
  void add(int x, long long c) {
    maxi[x] = max(maxi[x], c);
    if (ng[x] == 0 && maxi[x] > sum[x]) {
      ngsum++;
      ng[x] = 1;
    }
    if (ng[x] == 0 && c <= sum[x]) {
      pl++;
    }
  }
  void unite(int x, int y, long long cost = -1) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (ng[x] == 1 && ng[y] == 1) {
      ngsum--;
    }
    if (rank[x] < rank[y]) {
      par[x] = y;
      sum[y] += sum[x];
      maxi[y] = max(maxi[y], maxi[x]);
      ng[y] = max(ng[y], ng[x]);
      maxi[y] = max(cost, maxi[y]);
      if (ng[y] == 0 && maxi[y] > sum[y]) {
        ng[y] = 1;
        ngsum++;
      }
      if (ng[y] == 1 && maxi[y] <= sum[y]) {
        ng[y] = 0;
        ngsum--;
      }
    } else {
      if (rank[x] == rank[y]) rank[x]++;
      par[y] = x;
      sum[x] += sum[y];
      maxi[x] = max(maxi[x], maxi[y]);
      ng[x] = max(ng[x], ng[y]);
      maxi[x] = max(cost, maxi[x]);
      if (ng[x] == 0 && maxi[x] > sum[x]) {
        ng[x] = 1;
        ngsum++;
      }
      if (ng[x] == 1 && maxi[x] <= sum[x]) {
        ng[x] = 0;
        ngsum--;
      }
    }
  }
  bool same(int x, int y) { return find(x) == find(y); }
};
uftree uf;
int n, m;
long long x[100005];
edge e[100005];
vector<edge> ev;
int main(void) {
  scanf("%d%d", &n, &m);
  long long sum = 0;
  for (int i = 0; i < n; i++) {
    scanf("%lld", &x[i]);
    sum += x[i];
  }
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].c);
    e[i].u--;
    e[i].v--;
  }
  uf.init(n);
  int ct = 0;
  int cc = 0;
  sort(e, e + m);
  int ans = 0;
  uf.init(n);
  for (int i = 0; i < n; i++) {
    uf.sum[i] = x[i];
  }
  for (int i = 0; i < m; i++) {
    if (uf.same(e[i].u, e[i].v)) {
      uf.add(uf.find(e[i].u), e[i].c);
      if (ngsum == 0) {
        ans = i + 1;
        pl = 0;
      }
      continue;
    }
    uf.unite(e[i].u, e[i].v, e[i].c);
    if (ngsum == 0) {
      ans = i + 1;
      pl = 0;
    }
  }
  printf("%d\n", m - ans - pl);
  return 0;
}
