#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
#define INF 999999999

int n,q;
vector<int> Graph[100011];

int In[100011];
int WhoIs[100011];
int inctr=0;

int Depth[100011];
int First[100011];

int IT[1200001];
int L=0;
int LEAFOFFSET=1;

void DFS(int ver,int dad)
{
    int i;

    inctr++;
    In[ver]=inctr;
    WhoIs[inctr]=ver;

    L++;
    IT[L+LEAFOFFSET]=inctr;

    First[ver]=L;

    for (i=0;i<Graph[ver].size();i++)
    {
        if (Graph[ver][i]==dad)
        continue;

        Depth[ Graph[ver][i] ]=Depth[ver]+1;
        DFS(Graph[ver][i],ver);

        L++;
        IT[L+LEAFOFFSET]=In[ver];
    }

    return;
}

int MIN(int a,int b)
{
    if (a<b)
    return a;
    else
    return b;
}

int MinRec(int ver,int L,int R,int l,int r)
{
    if (L>r || R<l)
    return INF;
    else if (L>=l && R<=r)
    {
        return IT[ver];
    }
    else
    {
        return MIN( MinRec(2*ver,L,(L+R)/2,l,r) , MinRec(2*ver+1,(L+R)/2+1,R,l,r) );
    }
}

int GetMin(int L,int R)
{
    return MinRec(1,1,LEAFOFFSET+1,L,R);
}

int GetLCA(int a,int b)
{
    int L,R;
    int d;

    L=First[a];
    R=First[b];

    if (L>R)
    {
        d=L;
        L=R;
        R=d;
    }

    return WhoIs[ GetMin(L,R) ];
}

void Print(int a,int b,int ans)
{
    if (a==ans || b==ans)
    {
        printf("-1\n");
    }
    else
    {
        printf("%d\n",ans);
    }

    return;
}

int main()
{
    //freopen("test.txt","r",stdin);

    int i;
    int a,b;
    int c;
    int Root=1;
    int lcA,lcB;

    scanf("%d %d",&n,&q);

    while(LEAFOFFSET<2*n+2)
    LEAFOFFSET*=2;
    LEAFOFFSET--;

    for (i=0;i<=2*LEAFOFFSET+1;i++)
    {
        IT[i]=INF;
    }

    for (i=1;i<=n-1;i++)
    {
        scanf("%d %d",&a,&b);

        Graph[a].push_back(b);
        Graph[b].push_back(a);
    }

    Depth[1]=1;
    DFS(1,0);

    for (i=LEAFOFFSET;i>=1;i--)
    {
        IT[i]=MIN(IT[2*i],IT[2*i+1]);
    }

    for (i=1;i<=q;i++)
    {
        scanf("%d",&c);

        if (c==1)
        {
            scanf("%d",&Root);
        }
        else
        {
            scanf("%d %d",&a,&b);

            lcA=GetLCA(a,Root);
            lcB=GetLCA(b,Root);

            if (lcA==lcB)
            {
                lcA=GetLCA(a,b);

                Print(a,b,lcA);
            }
            else
            {
                if (Depth[lcA]>Depth[lcB])
                Print(a,b,lcA);
                else
                Print(a,b,lcB);
            }
        }
    }

    return 0;
}