#include <bits/stdc++.h>

#define rep(i,x,y) for (int i = (x); i<=(y); i++)
#define repe(i,x,y) for (int i = (x); i < (y);i++)
#define drep(i,x,y) for (int i = (x); i >= (y); i--)
#define mp make_pair
#define pb push_back
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAXN 100100
#define sf(n) scanf("%Lf",&n)
#define prf(n) printf("%Lf",n)
#define	s(n) scanf("%d",&n)
#define sl(n) scanf("%lld",&n)
#define pr(n) printf("%d",n)
#define prl(n) printf("%lld",n)
#define endc printf("\n")
#define psp printf(" ")

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;

const int buffer=1<<13;
char buff[buffer]; int cnt=0;

int gi() {
	int x; s(x); return x;
    /*int number = 0;
    while(buff[cnt] < '0' || '9' < buff[cnt])
        if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0;

    while('0' <= buff[cnt] && buff[cnt] <= '9') {
        number = number * 10 + buff[cnt] - '0';
        if(++cnt >= buffer) fread(buff, buffer, 1, stdin), cnt = 0;
    }

    return number;*/
}

vector<int> current;
stack< vector<int> > S;

typedef struct node {
	 stack<int> A;
	 int name;

	 node() {
	 }

	 node(int name):name(name) {
	 	A = *new stack<int>(); A.push(-1);
	 }

	 int get() {
	 	return A.top();
	 }

	 int undo() {
	 	A.pop();
	 }

	 int set(int v) {
	 	A.push(v); S.top().pb(name);
	 }

} node;

node Z[MAXN];

void unionS(int x,int y) {
	Z[x].set(y);
}

int findS(int x) {
	//cout<<x<<" : "<<Z[x].get()<<endl;
	if (Z[x].get() < 0) {
		return x;
	}
	int y = findS(Z[x].get());
	Z[x].set(y);
	return y;
}

int main() {
	S = *new stack< vector<int> >();
	int n = gi(), m = gi();
	//cout<<n<<" "<<m<<endl;
	rep(i,1,n) {
		Z[i] = *new node(i);
	}

	while (m--) {
		int type = gi();
		if (type == 1) {
			current.clear(); S.push(current);
			int x = gi(), y = gi();
			int a = findS(x), b = findS(y);
			if (a != b) { unionS(a,b); }
		} else if (type == 2) {
			int x = gi();
			while (x--) {
				vector<int> V = S.top(); S.pop();
				repe(j,0,V.size()) {
					Z[V[j]].undo();
				}
			}
		} else {
			int x = gi(), y = gi();
			int a = findS(x), b = findS(y);
			pr(a==b ? 1 : 0); endc;
		}
		//cout<<"Ok"<<endl;
	}

}