#include<bits/stdc++.h>
using namespace std;
int n,k,t,a,b,ans=0;
int fa[150010]={};
int find(int a){
if(fa[a]==a) return a;
return (fa[a]=find(fa[a]));
}
/*
1. 弱智的假话
(1) a,b中任意一个>n
(2) t=2 和 a==b
2. 不弱智的假话
设三个表格(存储在一个数组中)
第一“行”表示同类“爹”
第二“行”表示捕食者“爹”
第三“行”表示天敌“爹”
t=1 时:
假如他是真话:第一行[a]=find(第一行[b]);第二行[a]=find(第二行[b]);第三行[a]=find(第三行[b]);
t=2 时:
假如他是真话:第一行[a]=find(第三行[b]);第二行[a]=find(第一行[b]);第三行[a]=find(第二行[b]);
判断假话
t=1时:
如果find(第一行[a])==find(第三行[b]) 或者 find(第一行[a])==find(第二行[b])
t=2时:
如果find(第一行[a])==find(第三行[b]) 或者 find(第一行[a])==find(第一行[b])
*/
int main(){
cin>>n>>k;
for(int i=1;i<=3*n;i++) fa[i]=i;//我 是 我 爹
for(int i=0;i<k;i++){
cin>>t>>a>>b;
//弱智的假话
if(a>n || b>n) ans++;
if(t==2 && a==b) ans++;
//不弱智的假话
if(t==1){
if(find(a)==find(b+2*n) || find(a)==find(b+n)) ans++;
else fa[a]=find(b),fa[a+n]=find(b+n),fa[a+2*n]=find(b+2*n);
//第一行[a]=find(第一行[b]);第二行[a]=find(第二行[b]);第三行[a]=find(第三行[b]);
}else{
if(find(a)==find(b) || find(a)==find(b+2*n)) ans++;
else fa[a]=find(b+2*n),fa[a+n]=find(b),fa[a+2*n]=find(b+n);
}
}cout<<ans<<endl;
return 0;
}