#include <iostream>
#include <fstream>
#include <set>
#include <cstring>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#include <queue>
#include <iomanip>

using namespace std;

#define ll long long
#define inf (1<<30)
#define maxn 100010

ifstream fin ("A.in");
ofstream fout ("A.out");

int E[2*maxn],L[maxn],P[maxn];
int rmq[18][2*maxn];
vector<int> T[maxn];
int n,m,x,t,a,b,op,y;

void euler (int x, int f, int lv)
{
    E[++t] = x;
    L[x] = lv;
    P[x] = t;

    for (int i = 0; i < T[x].size(); ++i)
    {
        if (T[x][i] != f)
        {
            euler (T[x][i], x, lv+1);
            E[++t] = x;
        }
    }
}

int lca (int x, int y)
{
    int a = P[x];
    int b = P[y];

    if (a > b)
        swap (a,b);

    int c = log2(b-a+1);

    if ( L[rmq[c][a]] < L[rmq[c][b-(1<<c)+1]])
        return rmq[c][a];
    else return rmq[c][b-(1<<c)+1];
}

int main()
{
    cin>>n>>m;

    for (int i = 1; i < n; ++i)
    {
        cin>>a>>b;

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

    euler(1,0,1);

    for (int i = 1; i <= t; ++i)
    {
        rmq[0][i] = E[i];
    }

    for (int i = 1; (1<<i) <= t; ++i)
    {
        for (int j = 1; j + (1<<i) -1 <= t; ++j)
        {
            if (L[rmq[i-1][j]] < L[rmq[i-1][j+(1<<(i-1))]])
                rmq[i][j] = rmq[i-1][j];
            else rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
        }
    }

    int cr = 1;

    for (int i = 1; i <= m; ++i)
    {
        cin>>op;

        if (op == 1)
        {
            cin>>x;
            cr = x;
        }
        else
        {
            cin>>x>>y;
            int a = lca(x,y);
            int b = lca(x,cr);
            int c = lca(y,cr);

            int l = a;

            if (L[b] > L[l])
                l = b;
            if (L[c] > L[l])
                l = c;

            if (l == x || l == y)
                cout<<-1;
            else cout<<l;
            cout<<"\n";
        }
    }
}