#include<bits/stdc++.h>
using namespace std;
vector<int>fa,j[200005];
int f[100005],r[100005];
int find(int x)
{
if(x==fa[x])return x;
return fa[x]=find(fa[x]);
}
void hb(int x,int y)
{
x=find(x),y=find(y);
if(x==y)return;
if(r[x]>r[y])fa[y]=x;
else
{
if(r[x]==r[y])r[y]++;
fa[x]=y;
}
}
struct node{
int o,a,b,k;
}a[200005];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n,m;
cin>>n>>m;
fa.push_back(0);
for(int i=1;i<=n;i++)
fa.push_back(i),r[i]=1;
for(int i=1;i<=m;i++)
{
cin>>a[i].o;
if(a[i].o==2)
{
cin>>a[i].k;
f[a[i].k]++;
}
else cin>>a[i].a>>a[i].b;
}
if(f[0])j[0]=fa;
for(int i=1;i<=m;i++)
{
int opt,d,b,k;
opt=a[i].o;
if(opt==1)
{
d=a[i].a;
b=a[i].b;
hb(d,b);
}
else if(opt==2)
{
k=a[i].k;
fa=j[k];
f[k]--;
if(f[k]==0)j[k].clear();
}
else
{
d=a[i].a;
b=a[i].b;
if(find(d)==find(b))cout<<"1\n";
else cout<<"0\n";
}
if(f[i])j[i]=fa;
}
return 0;
}