#include <iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<bitset>
using namespace std;
#define lson root<<1
#define rson root<<1|1
#define MID int m = (l+r)/2;
const int inf = 0x3f3f3f3f;
const int mmax = 59999;
int f[150010];
int n,k;
int find(int x)
{
if(x==f[x])
return x;
else
return f[x] = find(f[x]);
}
bool same(int x,int y)
{
return find(x)==find(y);
}
void unite(int x,int y)
{
int u = find(x);
int v = find(y);
if(u!=v)
f[u] = v;
}
int main()
{
//x大y一个n代表x吃y
//x,y相等代表同类
//x小于y一个n代表y吃x
//当然整体情况是%3n之后得出来的
scanf("%d%d",&n,&k);
int d,x,y;
int ans=0;
for(int i=1; i<=3*n; i++)
f[i] = i;
while(k--)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n||(d==2&&x==y))
{
ans++;
continue;
}
if(d==1)
{
if(same(x,y+n)||same(x,y+2*n))
ans++;
else
{
unite(x,y);
unite(x+n,y+n);
unite(x+2*n,y+2*n);
}
}
else
{
if(same(x,y)||same(x,y+n))
ans++;
else
{
unite(x+n,y);//代表x吃y的三种情况
unite(x+2*n,y+n);
unite(x,y+2*n);
}
}
}
printf("%d\n",ans);
return 0;
}