#include <bits/stdc++.h>
int cost[105][105];
int d[105];
int used[105];
int d2[105][105];
int N, M;
int a[1005];
int b[1005];
int c[1005];
void dijkstra(int s) {
  int i;
  for (i = 0; i < N; i++) {
    d[i] = 1 << 20;
    used[i] = 0;
  }
  d[s] = 0;
  while (1) {
    int v = -1;
    for (i = 0; i < N; i++) {
      if (used[i] == 0 && (v == -1 || d[i] < d[v])) {
        v = i;
      }
    }
    if (v == -1) {
      break;
    }
    used[v] = 1;
    for (i = 0; i < N; i++) {
      if (d[i] > d[v] + cost[v][i]) {
        d[i] = d[v] + cost[v][i];
      }
    }
  }
}
void warshall_floyd() {
  int i, j, k;
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      d2[i][j] = cost[i][j];
    }
  }
  for (k = 0; k < N; k++) {
    for (i = 0; i < N; i++) {
      for (j = 0; j < N; j++) {
        if (d2[i][j] > d2[i][k] + d2[k][j]) {
          d2[i][j] = d2[i][k] + d2[k][j];
        }
      }
    }
  }
}
int main() {
  scanf("%d %d", &N, &M);
  int i, j;
  for (i = 0; i < M; i++) {
    scanf("%d %d %d", &a[i], &b[i], &c[i]);
    cost[a[i] - 1][b[i] - 1] = c[i];
    cost[b[i] - 1][a[i] - 1] = c[i];
  }
  for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++) {
      if (i == j) {
        cost[i][j] = 0;
      } else {
        if (cost[i][j] == 0) {
          cost[i][j] = 1 << 20;
        }
      }
    }
  }
  warshall_floyd();
  int ans = 0;
  for (i = 0; i < M; i++) {
    cost[a[i] - 1][b[i] - 1] = 1 << 20;
    cost[b[i] - 1][a[i] - 1] = 1 << 20;
    dijkstra(a[i] - 1);
    int flag = 1;
    for (j = 0; j < N; j++) {
      if ((d2[a[i] - 1][j] != d[j]) || d[j] == 1 << 20) {
        flag = 0;
        break;
      }
    }
    ans += flag;
    cost[a[i] - 1][b[i] - 1] = c[i];
    cost[b[i] - 1][a[i] - 1] = c[i];
  }
  printf("%d\n", ans);
  return 0;
}
