#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i<=k;++i)
#define drp(i,j,k) for(register int i(j);i>=k;--i)
using namespace std;
typedef long long lxl;
template<typename T>
inline T max(T &a, T &b) {
return a > b ? a : b;
}
template<typename T>
inline T min(T &a, T &b) {
return a < b ? a : b;
}
inline char gt() {
static char buf[1 << 21], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}
template <typename T>
inline void read(T &x) {
register char ch = gt();
x = 0;
int w(0);
while(!(ch >= '0' && ch <= '9'))w |= ch == '-', ch = gt();
while(ch >= '0' && ch <= '9')x = x * 10 + (ch & 15), ch = gt();
w ? x = ~(x - 1) : x;
}
template <typename T>
inline void out(T x) {
if(x < 0) x = -x, putchar('-');
char ch[20];
int num(0);
while(x || !num) ch[++num] = x % 10 + '0', x /= 10;
while(num) putchar(ch[num--]);
putchar('\n');
}
const int N=5e4+79;
int n,m,ans,fa[N*3];
inline int find(int x){
while(x!=fa[x]) x=fa[x]=fa[fa[x]];
return x;
}
inline void merge(int x,int y){
fa[find(x)]=find(y);
}
#define debug puts("y_dove yyds");
int main() {
read(n);read(m);
rep(i,1,n*3) fa[i]=i;
int op,x,y;
rep(i,1,m)
{
read(op);read(x);read(y);
if(x>n||y>n){
ans++;
continue;
}
int x_eat=x+n,x_enemy=x+n+n;
int y_eat=x+n,y_enemy=y+n+n;
if(op==1){
if(find(x_eat)==find(y)||find(x)==find(y_eat)){
ans++;
continue;
}
merge(x,y);
merge(x_eat,y_eat);
merge(x_enemy,y_enemy);
}
else{
if(find(x)==find(y)||find(x)==find(y_eat)){
ans++;
continue;
}
merge(x_eat,y);
merge(x,y_enemy);
merge(x_enemy,y_eat);
}
}
out(ans);
return 0;
}