/*
*/
 
//#pragma comment(linker, "/STACK:16777216")
#include <fstream>
#include <iostream>
#include <string>
#include <complex>
#include <math.h>
#include <set>
#include <vector>
#include <map>
#include <queue>
#include <stdio.h>
#include <stack>
#include <algorithm>
#include <list>
#include <ctime>
#include <memory.h>
#include <ctime> 
 
#define y0 sdkfaslhagaklsldk
#define y1 aasdfasdfasdf
#define yn askfhwqriuperikldjk
#define j1 assdgsdgasghsf
#define tm sdfjahlfasfh
#define lr asgasgash
 
#define eps 1e-9
//#define M_PI 3.141592653589793
#define bs 2717401869ll
#define bsize 256
#define right adsgasgadsg
#define free adsgasdg
#define MAG 10000

using namespace std;

long n,m,tp,a,b;
vector<long> events;
long w[1<<20],d[1<<20];
vector<pair<long, pair<long, long> > > mem[1<<20];
long tt;

long get(long x)
{
 if (x==w[x]) return x;
 return get(w[x]);
}

int main(){
//freopen("evacuation.in","r",stdin);
//freopen("evacuation.out","w",stdout);
//freopen("C:/input.txt","r",stdin);
//freopen("C:/output.txt","w",stdout);
//ios_base::sync_with_stdio(0);
//cin.tie(0);

scanf("%ld%ld",&n,&m);

//cin>>n>>m;
for (int i=1;i<=n;i++)
 w[i]=i;

for (int i=1;i<=m;i++)
{
// cin>>tp;
mem[i].reserve(8);
scanf("%ld",&tp);
 if (tp==3)
 {
//  cin>>a>>b;
scanf("%ld%ld",&a,&b);
  if (get(a)==get(b))
  puts("1");
  else puts("0");
//   else cout<<0<<"\n";//endl;
 }
 if (tp==1)
 {
//  cin>>a>>b;
scanf("%ld%ld",&a,&b);
  events.push_back(i);
  long aa,bb;
  aa=get(a);
  bb=get(b);
  if (aa==bb)continue;
  a=aa;
  b=bb;
  if (d[a]>d[b])
  swap(a,b);
  w[a]=b;
  mem[i].push_back(make_pair(1,make_pair(a,b)));
  if (d[a]==d[b])
   mem[i].push_back(make_pair(2,make_pair(b,b)));
 }
 if (tp==2)
 {
           scanf("%ld",&a);
  for (;a;--a)
  {
   tt=events.back();
   events.pop_back();
   for (int j=0;j<mem[tt].size();j++)
   {
    if (mem[tt][j].first==1)
    {
     w[mem[tt][j].second.first]=mem[tt][j].second.first;
    }
    else
     d[mem[tt][j].second.first]--;
   }
  }
 }
}

cin.get();cin.get();
return 0;}