#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define vvi vector<vector<int>>
#define vt vector
#define arr array
#define ALL(x) begin(x), end(x)
#define rALL(x) rbegin(x), rend(x)
#define SZ(x) x.size()
#define P(x, y) make_pair(x, y)
const int MOD1=998244353;
const ll MOD2=1e9+7;
const ll LINF=3e18;
const int INF=1e9;
const int N=1e5;
vt<ll> p(N + 1), sz(N + 1, 1);
ll find(ll x){
if (x == p[x]) return x;
return p[x] = find(p[x]);
}
ll merge(ll x, ll y){
x = find(x), y = find(y);
if (x == y) return 0;
if (sz[x] < sz[y]) swap(x, y);
sz[x] += sz[y];
p[y] = x;
return 1;
}
void solve(){
ll n, m;
cin >> n >> m;
vt<arr<ll, 3>> e(m);
for (auto &[u, v, w] : e) cin >> u >> v >> w;
iota(ALL(p), 0);
sort(ALL(e), [](arr<ll, 3> &a, arr<ll, 3> &b){
return a[2] < b[2];
});
ll ans = 0;
for (int i = 0; i < m; ){
ll k = e[i][2];
vt<ll> idx;
while(i < m && e[i][2] == k){
if (find(e[i][0]) == find(e[i][1])){
i++;
continue;
}
idx.pb(i++);
}
for (auto x : idx){
if (merge(e[x][0], e[x][1])) continue;
ans++;
}
}
cout << ans << '\n';
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
solve();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBwaWkgcGFpcjxpbnQsIGludD4KI2RlZmluZSBwbGwgcGFpcjxsbCwgbGw+CiNkZWZpbmUgdnZpIHZlY3Rvcjx2ZWN0b3I8aW50Pj4KI2RlZmluZSB2dCB2ZWN0b3IKI2RlZmluZSBhcnIgYXJyYXkKI2RlZmluZSBBTEwoeCkgYmVnaW4oeCksIGVuZCh4KQojZGVmaW5lIHJBTEwoeCkgcmJlZ2luKHgpLCByZW5kKHgpCiNkZWZpbmUgU1ooeCkgeC5zaXplKCkKI2RlZmluZSBQKHgsIHkpIG1ha2VfcGFpcih4LCB5KQpjb25zdCBpbnQgTU9EMT05OTgyNDQzNTM7CmNvbnN0IGxsIE1PRDI9MWU5Kzc7CmNvbnN0IGxsIExJTkY9M2UxODsKY29uc3QgaW50IElORj0xZTk7Cgpjb25zdCBpbnQgTj0xZTU7CnZ0PGxsPiBwKE4gKyAxKSwgc3ooTiArIDEsIDEpOwoKbGwgZmluZChsbCB4KXsKCWlmICh4ID09IHBbeF0pIHJldHVybiB4OwoJcmV0dXJuIHBbeF0gPSBmaW5kKHBbeF0pOwp9CgpsbCBtZXJnZShsbCB4LCBsbCB5KXsKCXggPSBmaW5kKHgpLCB5ID0gZmluZCh5KTsKCWlmICh4ID09IHkpIHJldHVybiAwOwoJCglpZiAoc3pbeF0gPCBzelt5XSkgc3dhcCh4LCB5KTsKCXN6W3hdICs9IHN6W3ldOwoJcFt5XSA9IHg7CglyZXR1cm4gMTsKfQoKdm9pZCBzb2x2ZSgpewogICAgbGwgbiwgbTsKICAgIGNpbiA+PiBuID4+IG07CiAgICB2dDxhcnI8bGwsIDM+PiBlKG0pOwogICAgZm9yIChhdXRvICZbdSwgdiwgd10gOiBlKSBjaW4gPj4gdSA+PiB2ID4+IHc7CiAgICBpb3RhKEFMTChwKSwgMCk7CiAgICAKICAgIHNvcnQoQUxMKGUpLCBbXShhcnI8bGwsIDM+ICZhLCBhcnI8bGwsIDM+ICZiKXsKICAgIAlyZXR1cm4gYVsyXSA8IGJbMl07CiAgICB9KTsKICAgIAogICAgbGwgYW5zID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKXsKICAgIAlsbCBrID0gZVtpXVsyXTsKICAgIAl2dDxsbD4gaWR4OwogICAgCXdoaWxlKGkgPCBtICYmIGVbaV1bMl0gPT0gayl7CiAgICAJCWlmIChmaW5kKGVbaV1bMF0pID09IGZpbmQoZVtpXVsxXSkpewogICAgCQkJaSsrOwogICAgCQkJY29udGludWU7CiAgICAJCX0KICAgIAkJaWR4LnBiKGkrKyk7CiAgICAJfQogICAgCWZvciAoYXV0byB4IDogaWR4KXsKICAgIAkJaWYgKG1lcmdlKGVbeF1bMF0sIGVbeF1bMV0pKSBjb250aW51ZTsKICAgIAkJYW5zKys7CiAgICAJfQogICAgfQogICAgY291dCA8PCBhbnMgPDwgJ1xuJzsKfQoKaW50IG1haW4oKXsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICAKICAgIHNvbHZlKCk7CgogICAgcmV0dXJuIDA7Cn0=