#include <iostream>
#include <algorithm>

constexpr int INF=(int)1e9;

struct edge{
	int from,to,cost;
	edge()=default;
	edge(int _f,int _t,int _c) : from(_f),to(_t),cost(_c) {}
};

int n,m;

int dp[100][100];

edge edges[1000];

int main() {
	std::cin>>n>>m;
	int a,b,c;
	for(int i=0;i<n;++i){
		for(int j=0;j<n;++j)
			dp[i][j]=INF;
	}
	for(int i=0;i<m;++i){
		std::cin>>a>>b>>c;
		--a;
		--b;
		dp[a][b]=c;
		dp[b][a]=c;
		edges[i]=edge(a,b,c);
	}
	for(int i=0;i<n;++i){
		for(int j=0;j<n;++j){
			for(int k=0;k<n;++k)
				dp[j][k]=std::min(dp[j][k],dp[j][i]+dp[i][k]);
		}
	}

	int ans=0;

	for(int i=0;i<m;++i){
		int a=edges[i].from;
		int b=edges[i].to;
		if(dp[a][b]<edges[i].cost)
			++ans;
	}
	std::cout<<ans<<std::endl;
	return 0;
}