#include"bits/stdc++.h"
#define ma 10001
using namespace std;
int fa[ma];
//找上一位
int findx(int x)
{
if(fa[x]==x) return x;//如果自己现在就是根节点,返回自己
else{
while(fa[x]!=x){
x=fa[x];
return x;
}
//否则找自己上一级直到到根节点
}
}
//优化一下 (路径压缩)
int findy(int x)
{
if(fa[x]==x) return x;
return fa[x]=findy(fa[x]);//将x到根节点路上的所有点的上级都设为根节点
}
bool fan(int a,int b)
{
int a1=findx(a);
int b1=findx(b);
if(a1==b1) return 1;//如果a,b根节点相同,那么他们在同一集合中
else return 0;
}
void jo(int a,int b)
{
int a1=findx(a);
int b1=findx(b);
if(a1!=b1) fa[a1]=b1;//如果a,b根节点不同,那么设定a的根节点的上级为b的根节点(那么也是在同一集合中了)
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
fa[i]=i;//最开始每个点的根节点都是自己
}
for(int j=1;j<=m;j++)
{
int s,a,b;
cin>>s>>a>>b;
if(s==1) jo(a,b);
if(s==2) cout<<fan(a,b);
}
return 0;
}