class UnionFind:
    def __init__(self, size, wtlist):
        self.parent = [-1 for i in range(size)]#非負なら親ノード，負ならグループの要素数
        self.wtsum = wtlist[:] #自頂点が親の場合、連結成分の頂点の重みの和
        self.wtmax = wtlist[:] #自頂点が親の場合、連結成分の頂点の重みの最大値
        self.edgenum = [0]*size #自頂点が親の場合、連結成分の辺の本数
        self.edgewtsum = [0]*size #自頂点が親の場合、連結成分の辺の重みの和
        self.edgewtmax = [0]*size #自頂点が親の場合、連結成分の辺の重みの最大値

        self.valid_edgenum = [0]*size #自頂点が親の場合、「有効な辺の数」

    def root(self, x): #root(x): xの根ノードを返す．
        if self.parent[x] < 0:
            return x
        else:
            self.parent[x] = self.root(self.parent[x]) #xをxの根に直接つなぐ
            return self.parent[x]

    def merge(self, x, y, m): #merge(x,y,m): xとyを「重さmの辺で」連結させる
        x = self.root(x)
        y = self.root(y)
        if x == y:
            self.edgenum[x] += 1 #辺の本数を更新
            self.edgewtsum[x] += m #辺の重みの和を更新
            self.edgewtmax[x] = max(m,self.edgewtmax[x]) #辺の重みの最大値を更新
            return False
        if self.parent[x] > self.parent[y]: #xの要素数がyの要素数より「小さい」とき入れ替える
            x,y=y,x
        self.parent[x] += self.parent[y] #xの要素数を更新
        self.wtsum[x] += self.wtsum[y] #頂点の重みの和を更新
        self.wtmax[x] = max(self.wtmax[x], self.wtmax[y]) #頂点の重みの最大値を更新
        self.edgenum[x] += 1 + self.edgenum[y] #辺の本数を更新
        self.edgewtsum[x] += m + self.edgenum[y] #重みの和を更新
        self.edgewtmax[x] = max(m,self.edgewtmax[x],self.edgewtmax[y]) #辺の重みの最大値を更新

        self.valid_edgenum[x] = self.valid_edgenum[x] + self.valid_edgenum[y] #「有効な辺の数」を更新

        self.parent[y] = x #yをxにつなぐ
        return True

    def issame(self, x, y): #same(x,y): xとyが同じグループにあるならTrue
        return self.root(x) == self.root(y)
        
    def size(self,x): #size(x): xのいるグループの要素数を返す
        return -self.parent[self.root(x)]




n,m=[int(i) for i in input().split()]
X=[int(i) for i in input().split()]
 
edges=[0 for i in range(m)]
for i in range(m):
    edges[i]=[int(i)-1 for i in input().split()]
    edges[i][2] += 1
edges.sort(key=lambda x: x[2])
 
#print(edges)
 
uf = UnionFind(n,X)

for edge in edges:
    x0=edge[0]
    x1=edge[1]
    uf.merge(x0,x1,edge[2])
    r0=uf.root(x0)
#    print(uf.wtsum,uf.edgewtmax)
    if uf.wtsum[r0] >= uf.edgewtmax[r0]:
        uf.valid_edgenum[r0] = uf.edgenum[r0]
#        print("ok")
 
#print(uf.oksize,uf.esize)
 
num=0
for i in range(n):
    if uf.root(i) ==i:
        num += uf.valid_edgenum[i]
#print(uf.valid_edgenum,uf.edgenum)
print(m-num)