import sys
readline = sys.stdin.buffer.readline

#ダイクストラ法通常版
#O(ElogV)
import heapq
def dijkstra_heap(s,edge):
    #始点sから各頂点への最短距離
    d = [float("inf")] * (n+1)
    used = [True] * (n+1) #True:未確定
    d[s] = 0
    used[s] = False
    edgelist = []
    for e in edge[s]:
        heapq.heappush(edgelist,e)
    while len(edgelist): #キューから値が無くなるまで
        minedge = heapq.heappop(edgelist)
        #まだ使われてない頂点の中から最小の距離のものを探す
        if not used[minedge[1]]: #既に最小距離が確定しているなら
            continue
        v = minedge[1] #vに頂点を代入
        d[v] = minedge[0] #その頂点のコストに重みを代入
        used[v] = False #vには最小距離が入っていることが証明できる(ヒープキューを使用しているため)
        for e in edge[v]: #頂点vから伸びている辺の先をヒープキューに入れてく
            if used[e[1]]:
                heapq.heappush(edgelist,[e[0]+d[v],e[1]])
    return d #回しきったらreturn(たどり着けなかった頂点はinf.)

if __name__ == "__main__":
    n,e = map(int,readline().split()) #n:頂点数　e:辺の数
    g = [[] for i in range(n+1)] #g[i]:点iに隣接している点のリスト
    for i in range(e):
        x,y,w = map(int,readline().split())
        x,y = x,y
        g[x].append([w,y])
        g[y].append([w,x])
    
    ans = 0

    for i in range(n):
        plane = dijkstra_heap(i,g)
        for j in range(len(g[i])):
            res = g[i].pop(j)
            if plane == dijkstra_heap(i,g):
                ans += 1
            g[i].insert(j,res)
    
    print(ans)



    