带权并查集
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
#define eps 1e-8
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3fLL
#define _clr(x,a) memset(x,a,sizeof(x))
#define min(a,b)) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define rep(i,n) for(int i=1;i<=n;++i)
using namespace std;
//#define sponge_wxy_code
const int MAXN = 200010;
int parent[MAXN], sum[MAXN];
int n, m;
void init_set() {
for(int i = 1; i <= n+1; ++i) {
parent[i] = -1;
sum[i] = 0;
}
return ;
}
int find_set(int u) {
if(parent[u] < 0) return u;
int temp = parent[u];
parent[u] = find_set(parent[u]);
sum[u] = sum[u] + sum[temp];
return parent[u];
}
void union_set(int r1, int r2, int u, int v, int val) {
if(r1 < r2) {
sum[r2] = sum[u] + val - sum[v];
parent[r1] += parent[r2];
parent[r2] = r1;
} else {
sum[r1] = sum[v] - sum[u] - val;
parent[r2] += parent[r1];
parent[r1] = r2;
}
return ;
}
int main() {
#ifdef sponge_wxy_code
freopen("aa.in", "r", stdin);
freopen("bb.out", "w", stdout);
#endif
int u, v, val, ans;
while(scanf("%d %d", &n, &m) != EOF) {
init_set(); ans = 0;
//rep(i, n) printf("%d ", parent[i]);
//printf("\n");
while(m--) {
scanf("%d %d %d", &u, &v, &val); v++;
int r1 = find_set(u), r2 = find_set(v);
if(r1 == r2) {
if(sum[v] - sum[u] != val)
ans++;
} else {
union_set(r1, r2, u, v, val);
}
}
printf("%d\n", ans);
}
return 0;
}