#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = double;
using pi = pair<int, int>;
using pll = pair<ll, ll>;
using pld = pair<ld, ld>;
using ti3 = tuple<int, int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using vld = vector<ld>;
using vpi = vector<pi>;
using vpll = vector<ll>;
using vpld = vector<ld>;
using vti3 = vector<ti3>;
const double EPS = 1e-9;
const int inf = numeric_limits<int>::max();
ll pow(ll base, ll i, ll mod) {
  ll a = 1;
  while (i) {
    if (i & 1) {
      a *= base;
      a %= mod;
    }
    base *= base;
    base %= mod;
    i >>= 1;
  }
  return a;
}
ll gcd(ll a, ll b) {
  while (b) {
    ll c = a % b;
    a = b;
    b = c;
  }
  return a;
}
ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }
template <typename T>
bool chmin(T& a, const T& b) {
  if (a > b)
    return a = b, true;
  else
    return false;
}
template <typename T>
bool chmax(T& a, const T& b) {
  if (a < b)
    return a = b, true;
  else
    return false;
}
void solve() {
  int N, M;
  cin >> N >> M;
  int dist[105][105] = {};
  for (int i = 0; i < int(N); ++i)
    for (int j = 0; j < int(N); ++j) dist[i][j] = inf / 2;
  int A[1005], B[1005], C[1005];
  for (int i = 0; i < int(M); ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    dist[a][b] = c;
    dist[b][a] = c;
    A[i] = a;
    B[i] = b, C[i] = c;
  }
  for (int k = 0; k < int(N); ++k) {
    for (int i = 0; i < int(N); ++i) {
      for (int j = 0; j < int(N); ++j) {
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
      }
    }
  }
  int ans = M;
  for (int i = 0; i < int(M); ++i) {
    bool flag = false;
    for (int j = 0; j < int(N); ++j)
      if (dist[j][A[i]] + C[i] == dist[j][B[i]]) flag = true;
    if (flag) ans--;
  }
  cout << ans << endl;
}
int main() {
  cin.tie(NULL);
  solve();
  return 0;
}
