#include <bits/stdc++.h>
using namespace std;
typedef struct edge_ {
  long long to, cost;
  edge_(long long to, long long cost) : to(to), cost(cost) {}
} edge;
typedef struct point_ {
  long long x, y;
  point_(long long x = 0, long long y = 0) : x(x), y(y) {}
} point;
template <typename T>
using mat2d = vector<vector<T>>;
constexpr double PI = 3.14159265358979323846;
constexpr int INF = (int)1e7;
constexpr long long MOD = (long long)1e9 + 7;
constexpr double EPS = 1e-7;
constexpr int dy4[4] = {0, 1, 0, -1};
constexpr int dx4[4] = {1, 0, -1, 0};
constexpr int dy8[8] = {0, 1, 1, 1, 0, -1, -1, -1};
constexpr int dx8[8] = {1, 1, 0, -1, -1, -1, 0, 1};
template <typename T>
istream& operator>>(istream& is, vector<T>& vec) {
  for (T& x : vec) is >> x;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& vec) {
  for (const T& x : vec) os << x << " ";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const vector<vector<T>>& mat) {
  for (const vector<T>& m : mat) os << m << endl;
  return os;
}
template <typename S, typename T>
istream& operator>>(istream& is, pair<S, T>& p) {
  is >> p.first >> p.second;
  return is;
}
istream& operator>>(istream& is, point& p) {
  is >> p.x >> p.y;
  return is;
}
template <typename S, typename T>
ostream& operator<<(ostream& os, const pair<S, T>& p) {
  os << "{" << p.first << " : " << p.second << "}";
  return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& s) {
  for (const T& x : s) os << x << " ";
  return os;
}
ostream& operator<<(ostream& os, const edge e) {
  os << "{to: " << e.to << ", cost: " << e.cost << "}";
  return os;
}
ostream& operator<<(ostream& os, const point& p) {
  os << "(" << p.x << " " << p.y << ")";
  return os;
}
template <typename T>
void warshallFloyd(vector<vector<T>>& d) {
  int N = d.size();
  for (int i = 1; i < N; i++)
    for (int j = 1; j < N; j++)
      for (int k = 1; k < N; k++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
int main() {
  int V, E;
  cin >> V >> E;
  vector<vector<int>> d(V + 1, vector<int>(V + 1, INF));
  for (int i = 1; i <= E; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    d[a][b] = d[b][a] = c;
  }
  vector<vector<int>> d_min;
  for (int i = 1; i <= V; i++) d[i][i] = 0;
  d_min = d;
  warshallFloyd(d_min);
  int ans = 0;
  for (int i = 1; i <= V; i++)
    for (int j = 1; j <= V; j++)
      if (i != j && d[i][j] != INF && d[i][j] != d_min[i][j]) ans++;
  cout << ans / 2 << endl;
  return 0;
}
