import sys
read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

import operator

N,M = map(int,readline().split())
X = list(map(int,readline().split()))
m = map(int,read().split())
ABY = list(zip(m,m,m))

# 併合を表す木を作成
# 作成可能な頂点がある
# 作成可能な頂点から降りていく -> 完成図における連結成分が分かる

def find_root(root,x):
    y = root[x]
    if x == y:
        return x
    path = [x]
    while True:
        z = root[y]
        if y == z:
            break
        path.append(y)
        y = z
    for x in path:
        root[x] = z
    return z

V = N+M+1
root = list(range(V+1))
parent = [0] * (V+1)
cost = [0] + X + [0]*M
is_adm = [True] * (N+1) + [False] * (M+1) # 連結成分として成立している集合

for T,(a,b,y) in enumerate(sorted(ABY,key=operator.itemgetter(2)),1):
    ra = find_root(root,a)
    rb = find_root(root,b)
    # rx と ry を時刻 T （node N+T）にマージする
    v = N+T
    root[ra] = v; parent[ra] = v
    root[rb] = v; parent[rb] = v
    if ra == rb:
        cost[v] = cost[ra]
    else:
        cost[v] = cost[ra] + cost[rb]
    is_adm[v] = (cost[v] >= y)
# 時刻 M+1 に、全部の根をマージ
for x in range(1,V):
    if not parent[x]:
        parent[x] = V

# 親が成立していたら、自分も成立
for v in range(V-1,-1,-1):
    if is_adm[parent[v]]:
        is_adm[v] = True

answer = M - sum(is_adm[N+1:N+M+1])
print(answer)