#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 110;
const int INF = 1e8;
int d1[MAX_N][MAX_N];
int d2[MAX_N][MAX_N];
int cost[MAX_N][MAX_N];
bool flag[MAX_N][MAX_N];
int main() {
  int N, M;
  cin >> N >> M;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      cost[i][j] = d1[i][j] = d2[i][j] = INF;
      flag[i][j] = false;
      if (i == j) d1[i][j] = d2[i][j] = 0;
    }
  }
  for (int i = 0; i < M; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    a--, b--;
    cost[a][b] = d1[a][b] = d2[a][b] = c;
    cost[b][a] = d1[b][a] = d2[b][a] = c;
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      for (int k = 0; k < N; k++) {
        if (d1[i][k] + d1[k][j] <= d1[i][j]) {
          d1[i][j] = d1[i][k] + d1[k][j];
        }
      }
    }
  }
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      for (int k = 0; k < N; k++) {
        if (d2[i][k] + d2[k][j] <= d2[i][j]) {
          d2[i][j] = d2[i][k] + d2[k][j];
          if (cost[i][k] == d1[i][k] && d2[i][j] == d1[i][j]) {
            flag[i][k] = true;
          }
          if (cost[k][j] == d1[k][j] && d2[i][j] == d1[i][j]) {
            flag[k][j] = true;
          }
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      if (!flag[i][j] && cost[i][j] != INF) ans++;
    }
  }
  cout << ans / 2 << endl;
  return 0;
}
