//在查询的时候 ,想dist在前面,递归在后面,WA,发现dist应该是从根部到叶子相加赋值,而不是叶子+父节点倒着到根。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 200000+5;
int pre[N], dist[N];
int n, k;
void init()
{
for(int i=0; i<=N; i++){
pre[i] = i;
dist[i] = 0;
}
}
int Find(int a)
{
if(pre[a]==a)
return a;
else{
int tmp = pre[a];
pre[a] = Find(pre[a]);
dist[a] += dist[tmp];
return pre[a];
}
}
bool Union(int a, int b, int c)
{
int x = Find(a);
int y = Find(b);
if(x == y){
if(dist[a]+c != dist[b]){
return false;
}
return true;
}
else {
pre[y] = x;
dist[y] = dist[a]-dist[b]+c;
return true;
}
// pre[Find(b)] = Find(a);
}
int main()
{
// cin >> n >> k;
while(scanf("%d %d", &n, &k)) {
init();
int ans = 0;
while (k--) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (!Union(a, b + 1, c))
ans++;
}
// cout << ans << endl;
printf("%d\n", ans);
}
return 0;
}