1 #include <bits/stdc++.h>
2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
4 #define INF 0x3f3f3f3f
5 #define MOD 1000000007
6 typedef long long ll;
7 using namespace std;
8 inline ll read()
9 {
10 ll ans = 0;
11 char ch = getchar(), last = ' ';
12 while(!isdigit(ch)) last = ch, ch = getchar();
13 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
14 if(last == '-') ans = -ans;
15 return ans;
16 }
17 inline void write(ll x)
18 {
19 if(x < 0) x = -x, putchar('-');
20 if(x >= 10) write(x / 10);
21 putchar(x % 10 + '0');
22 }
23
24 const int maxn = 150033;
25 int par[maxn];
26 int high[maxn];
27 int n,K;
28 void init(int n)
29 {
30 _for(i,1,3*(n+1))
31 {
32 par[i] = i;
33 high[i] = 0;
34 }
35 }
36
37 int find(int x)
38 {
39 return par[x] == x ? x : par[x] = find(par[x]);
40 }
41
42 void unite(int x,int y)
43 {
44 x = find(x);y = find(y);
45 if(x==y) return ;
46
47 if(high[x]<high[y])
48 par[x] = y;
49 else
50 {
51 par[y] = x;
52 if(high[x]==high[y])
53 high[x] ++;
54 }
55 }
56
57 bool same(int x,int y)
58 {
59 return find(x) == find(y);
60 }
61 bool judgeFalse(int a,int b,int c)
62 {
63 if(1==a)
64 {
65 if(same(b+n,c) || same(b+2*n,c))
66 return true;
67 }
68 else
69 {
70 if(same(b,c) || same(b,c+(2*n)))
71 return true;
72 }
73 return false;
74 }
75
76 int main()
77 {
78 n = read(),K = read();
79 init(n);
80 int ans = 0;
81 _for(i,1,K+1)
82 {
83 int a,b,c;
84 a = read(),b = read(),c = read();
85 if(b>n || c>n)
86 { ans ++;continue;}
87 else if(a==2 && b==c)
88 { ans ++;continue;}
89 if(judgeFalse(a,b,c))
90 { ans ++;continue;}
91 else if(a==1)
92 unite(b,c),unite((b+n),(c+n)),unite((b+n*2),(c+n*2));
93 else if(a==2)
94 unite(b,(c+n)),unite((b+n),(c+n*2)),unite((b+n*2),c);
95 }
96 printf("%d\n",ans);
97 return 0;
98 }