#include <bits/stdc++.h>
using namespace std;
struct edge {
  int s;
  int t;
  int d;
};
vector<edge> G;
int dis[100][100];
int main() {
  int N, M;
  cin >> N >> M;
  for (int i = 0; i < (N); i++) {
    for (int j = 0; j < (N); j++) {
      dis[i][j] = 1e9;
    }
  }
  for (int i = 0; i < (M); i++) {
    int a, b, c;
    cin >> a >> b >> c;
    dis[a - 1][b - 1] = c;
    dis[b - 1][a - 1] = c;
    G.push_back((edge){a - 1, b - 1, c});
  }
  for (int k = 0; k < (N); k++) {
    for (int i = 0; i < (N); i++) {
      for (int j = 0; j < (N); j++) {
        if (dis[i][k] != 1e9 && dis[k][j] != 1e9 &&
            dis[i][j] > dis[i][k] + dis[k][j]) {
          dis[i][j] = dis[i][k] + dis[k][j];
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i < (G.size()); i++) {
    bool flag = true;
    for (int j = 0; j < (N); j++) {
      if (dis[j][G[i].s] + G[i].d == dis[j][G[i].t]) {
        flag = false;
        break;
      }
    }
    if (flag) ans++;
  }
  cout << ans << endl;
  return 0;
}
