//当init在n,k输入之后时不会有输出(在Clion和Qt上是这样的),不过提交了能AC
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 50000+5;
int pre[N*3];//自己,吃 , 被吃
int n, k;
void init()
{
for(int i=0; i<=N*3; i++){
pre[i] = i;
}
}
int Find(int a)
{
return (pre[a]==a) ? a : Find(pre[a]);
}
/*
int Find(int x)//查询
{
while(pre[x] != x)
x = pre[x];
return x;
}
*/
void Union(int a, int b)
{
a = Find(a);
b = Find(b);
if(a != b)
pre[b] = a;
// pre[Find(b)] = Find(a);
}
int main()
{
// cin >> n >> k;
scanf("%d %d", &n, &k);
init();
int ans = 0;
while(k--){
int a, b, c;
// cin >> a >> b >> c;
scanf("%d %d %d", &a, &b, &c);
if(b > n || c > n || (a == 2 && b == c)) {
ans++;
// continue;
}
else if(a == 1){
//conflict
if(Find(b) == Find(c+n) || Find(b) == Find(c+2*n)){
ans++;
// continue;
}
//b,c是同类
else{
Union(b, c);
Union(b+n, c+n);
Union(b+2*n, c+2*n);
}
}
else if(a == 2){
if(Find(b) == Find(c+n) || Find(b) == Find(c)){
ans++;
// continue;
}
//b, c属于不同类且符合b吃c
else{
Union(b, c+n*2);//b和吃c的
Union(b+2*n, c+n);//吃b的和被c吃的
Union(b+n, c);//b吃的和c
}
}
}
// cout << ans << endl;
printf("%d\n", ans);
return 0;
}