#include<bits/stdc++.h>
#define MAX_N 50100
#define MAX_K 100100
int par[MAX_N];
int rank[MAX_N];
int T[MAX_K], X[MAX_K], Y[MAX_K];
void init(int n)
{
for (int i = 1; i <= n; i++)
{
par[i] = i;
rank[i] = 0;
}
}
int find(int x)
{
if (par[x] == x)
return x;
else
return find(par[x]);
}
void integrate(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
return;
if (rank[x] < rank[y])
par[x] = y;
else
{
par[y] = x;
if (rank[x] == rank[y])
rank[x]++;
}
}
bool same(int x, int y)
{
return find(x) == find(y);
}
int main()
{
int N, K;
std::cin >> N >> K;
init(N*3);
for (int i = 0; i < K; i++)
{
std::cin >> T[i] >> X[i] >> Y[i];
}
int ans = 0;
for (int i = 0; i < K; i++)
{
int t = T[i];
int x = X[i] - 1;
int y = Y[i] - 1;
if (x < 0 || x >= N || y < 0 || y >= N)
{
ans++;
continue;
}
if (t == 1)
{
if (same(x, y + N) || same(x, y + 2 * N))
{
ans++;
continue;
}
else
{
integrate(x, y);
integrate(x + N,y + N);
integrate(x + 2 * N, y + 2 * N);
}
}
else
{
if (same(x, y) || same(x, y + 2 * N))
{
ans++;
continue;
}
else
{
integrate(x, y + N);
integrate(x + N, y + 2 * N);
integrate(x + 2 * N, y);
}
}
}
std::cout << ans;
}