#include <iostream>
#include <cstdio>
#include <queue>
#include <cctype>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int, int> pii;
int read()
{
int out = 0;
char c;
while (!isdigit(c = getchar()));
for (; isdigit(c); c = getchar()) out = out * 10 + c - '0';
return out;
}
const int R = 12;
const int N = 30010;
const int M = 150010;
int head[N], to[M << 1], nxt[M << 1], edge[M << 1], cnt;
priority_queue<pii, vector<pii>, greater<pii> > q;
int n, m, r[N], lim[N][R], dis[N], vis[N], ans;
void add(int u, int v, int w)
{
nxt[++cnt] = head[u];
head[u] = cnt;
to[cnt] = v;
edge[cnt] = w;
}
int main()
{
n = read();
m = read();
for (int i = 1; i <= n; ++i) r[i] = read();
for (int i = 1; i <= m; ++i)
{
int u = read();
int v = read();
int w = read();
add(u, v, w);
add(v, u, w);
}
memset(lim, 0x3f, sizeof(lim));
ans = n;
for (int s = 10; s >= 1; --s)
{
for (int i = 1; i <= n; ++i) lim[i][s] = lim[i][s + 1];
for (int t = 1; t <= n; ++t)
{
if (r[t] != s) continue;
dis[t] = 0;
vis[t] = t;
lim[t][s] = 0;
q.push(pii(0, t));
while (!q.empty())
{
int u = q.top().second;
int d = q.top().first;
q.pop();
if (d > dis[u]) continue;
for (int i = head[u]; i; i = nxt[i])
{
int v = to[i];
int w = edge[i];
if ((vis[v] != t || dis[v] > d + w) && (d + w < lim[v][s + 1]))
{
if (vis[v] != t) ++ans;
vis[v] = t;
dis[v] = d + w;
lim[v][s] = min(lim[v][s], dis[v]);
q.push(pii(d + w, v));
}
}
}
}
}
cout << ans;
return 0;
}