#include<iostream> #include<hash_map> //#include"iphxer_h.h" #include<string> #include<cstring> #include<cstdio> #include<map> using namespace std; #define maxsize 50100 int rank1[maxsize];//相对于根元素的权值0:同类,1:x吃father[x],2表示被father[x] 吃 int father[maxsize]; void initU(int n){ for(int i=0;i<n;i++){ father[i]=i; rank1[i]=0; } } int Find(int x){ if(father[x]==x)return x; int t=father[x];//保存更新前的father位置,用来更新子rank father[x]=Find(father[x]); rank1[x]=(rank1[t]+rank1[x])%3;//计算相对于根节点的rank值 return father[x]; } //把y合并到x中,关系为d void Union(int x,int y,int d) { int xf=Find(x); int yf=Find(y); father[xf]=yf;//合并到y上 rank1[xf]=(rank1[y]-rank1[x]+3+d)%3; } int main() { int i,n,m; int d,x,y,xf,yf; int sum=0; scanf("%d%d",&n,&m); initU(n); for(int i=0;i<m;i++){ scanf("%d%d%d",&d,&x,&y); if(x>n||y>n||(d==2&&x==y)) ++sum; else{ xf=Find(x); yf=Find(y); if(xf==yf){ if((rank1[x]-rank1[y]+3)%3!=d-1) sum++; }else{ Union(x,y,d-1); } } } cout<<sum<<endl; }