#include<iostream>

using namespace std;

class UFT{
public:
  int P[10010];//その頂点の親を格納する

  //初めは全ての頂点はバラバラで違うグループに属する
  void init(int N){
    for(int i=0;i<N;i++) P[i]=i;
  }

  int root(int a){
    if(P[a]==a) return a;
    P[a]=root(P[a]);//aの親を辿っていく
    return P[a];
  }

  bool is_same_set(int a,int b){
    return root(a)==root(b);
  }

  void unite(int a,int b){
    //aのルートだったもののルートをbのルートにする
    P[root(a)]=root(b);
  }
};

int main(){
  int N,Q;cin >> N >> Q;
  int com,x,y;
  UFT P;P.init(N);
  for(int i=0;i<Q;i++){
    cin >> com >> x >> y;
    if(com==0){
      P.unite(x,y);
    }else{
      int t=(int)(P.is_same_set(x,y));
      cout << t << endl;
    }
  }
}


