#include <cstdio>

using namespace std;

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

int numar,num,sol[100005],x[100005],y[100005],tata[100005];

//getInt() reads and returns one integer at a time
int getInt() {
    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;
}
inline int boss(int nod)
{
    while (nod!=tata[nod])
        nod=tata[nod];
    return nod;
}
int main()
{
    int n = getInt();
    int m=getInt();
    for (int i=1;i<=n;i++)
        tata[i]=1;
    for (int i=1;i<=m;i++)
     {
         int tip=getInt();
         if (tip==1)
         {
             x[++numar]=getInt();
             y[numar]=getInt();
             tata[x[numar]]=y[numar];
         }
         if (tip==2)
         {
             int nr=getInt();
             tata[x[nr]]=x[nr];
         }
         else
         {
             int x=getInt();
             int y=getInt();
             if (boss(x)==boss(y))
               sol[++num]=1;
             else
                num++;
         }
     }
     for (int i=1;i<=num;i++)
       printf("%d\n",sol[i]);

}