#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"; } } }