#include<bits/stdc++.h>
usingnamespacestd;typedeflonglongLL;intpre[200010],ranks[200010];intfind(introot){if(pre[root]!=root){intf=pre[root];pre[root]=find(pre[root]);//递归路径压缩
ranks[root]+=ranks[f];/*精髓假如一开始没关系,那么用 rank 数组来表示 a,b 各自到各自祖先的距离。
那么在把 a 的祖先给 b 的祖先当父亲之后,那么 b 到祖先的距离也就是 rank[b] 就要再加上 b 原本的祖先到 a 的祖先的距离,更新一下,
其中 find 函数(找根节点的函数)里 rank[x]+=rank[pre[x]](这里 pre 数组存的是对应数的父节点)*/}returnpre[root];}intmain(){intn,m;while(~scanf("%d%d",&n,&m)){intans=0;for(inti=1;i<=n;i++)pre[i]=i;memset(ranks,0,sizeof(ranks));while(m--){inta,b,c;scanf("%d%d%d",&a,&b,&c);a--;//[a,b]~~(a--,b]
intfa=find(a);intfb=find(b);if(fa!=fb){pre[fb]=fa;//注意合并顺序,反过来下面的也要改
ranks[fb]=ranks[a]-ranks[b]+c;//更新距离
}else{if(ranks[b]-ranks[a]!=c)ans++;}}printf("%d\n",ans);}return0;}