#include <bits/stdc++.h>
using namespace std;
struct edge {
  int cost;
  int to;
  int from;
};
struct p_que {
  int heap[10000];
  int now;
};
struct p_que *make();
void push(p_que *p, int num);
int smal(p_que *p, int p_id);
int pop(p_que *p);
void dainyu(edge miti[], int a[], int b[], int c[], int m);
int d_stra(int w, int cost[], edge miti[], int edge_num, int node_num,
           p_que *pq);
int main(void) {
  int n, m;
  cin >> n >> m;
  int a[m], b[m], c[m];
  for (int i = 0; i < m; i++) cin >> a[i] >> b[i] >> c[i];
  int edge_num = m;
  int node_num = n;
  struct edge miti[edge_num];
  dainyu(miti, a, b, c, m);
  int ans = 0;
  for (int j = 0; j < m; j++) {
    p_que *pq;
    pq = make();
    int cost[node_num];
    for (int i = 0; i < node_num; i++) cost[i] = 10000;
    int start_node = a[j] - 1;
    cost[start_node] = 0;
    int w = start_node;
    for (int i = 0; i < node_num; i++) {
      w = d_stra(w, cost, miti, edge_num, node_num, pq);
    }
    if (cost[b[j] - 1] < c[j]) {
      ans++;
    }
  }
  cout << ans << endl;
  return 0;
}
void dainyu(edge miti[], int a[], int b[], int c[], int m) {
  for (int i = 0; i < m; i++) {
    miti[i].from = a[i];
    miti[i].to = b[i];
    miti[i].cost = c[i];
  }
}
int d_stra(int w, int cost[], edge miti[], int edge_num, int node_num,
           p_que *pq) {
  for (int i = 0; i < edge_num; i++) {
    if (w == miti[i].to) {
      if (cost[w] + miti[i].cost < cost[miti[i].from]) {
        push(pq, cost[w] + miti[i].cost);
        cost[miti[i].from] = cost[w] + miti[i].cost;
      }
    }
    if (w == miti[i].from) {
      if (cost[w] + miti[i].cost < cost[miti[i].to]) {
        push(pq, cost[w] + miti[i].cost);
        cost[miti[i].to] = cost[w] + miti[i].cost;
      }
    }
  }
  int re;
  re = pop(pq);
  return re;
}
struct p_que *make() {
  struct p_que *re;
  re = (struct p_que *)malloc(sizeof(struct p_que));
  if (re == NULL) {
    cout << "Eroor" << endl;
    return 0;
  } else {
    re->now = 0;
    for (int i = 0; i < 10000; i++) {
      re->heap[i] = 10000;
    }
    return re;
  }
}
void push(p_que *p, int num) {
  int tmp = 0;
  int c_id = p->now;
  p->heap[c_id] = num;
  while (p->heap[(c_id - 1) / 2] > p->heap[c_id]) {
    tmp = p->heap[(c_id - 1) / 2];
    p->heap[(c_id - 1) / 2] = num;
    p->heap[c_id] = tmp;
    c_id = (c_id - 1) / 2;
    if (c_id == 0) break;
  }
  p->now++;
}
int smal(p_que *p, int p_id) {
  if (p->heap[p_id * 2 + 2] < p->heap[p_id * 2 + 1])
    return p_id * 2 + 2;
  else
    return p_id * 2 + 1;
}
int pop(p_que *p) {
  if (p->now == 0) return -1;
  int tmp, min, p_id = 0, re = p->heap[0];
  p->now--;
  p->heap[0] = p->heap[p->now];
  while (p->now > p_id * 2 + 1) {
    if (p->now > p_id * 2 + 2)
      min = smal(p, p_id);
    else
      min = p_id * 2 + 1;
    if (p->heap[min] < p->heap[p_id]) {
      tmp = p->heap[min];
      p->heap[min] = p->heap[p_id];
      p->heap[p_id] = tmp;
      p_id = min;
    } else
      break;
  }
  return re;
}
