#include <bits/stdc++.h>

using namespace std;

#define MAXN 100050
#define MAXLOGN 20

int N, M, a, b, t;
vector<int> A[MAXN];
int T[MAXN];
int lvl[MAXN];
int dp[MAXLOGN][MAXN];
int maxk;
int root;

void dfs(int node, int prv) {
	lvl[node] = prv == -1 ? 0 : lvl[prv] + 1;
	T[node] = prv;
	
	for (vector<int> :: iterator it = A[node].begin(); it != A[node].end(); it++) {
		int x = *it;
		if (x != prv) {
			dfs(x, node);
		}
	}
}

void precalc() {
	for (int i = 0; i < N; i++) {
		dp[0][i] = T[i];
	}
	maxk = 0;
	for (int j = 1; (1 << j) <= N; j++) {
		for (int i = 0; i < N; i++) {
			if (dp[j - 1][i] == -1) {
				dp[j][i] = -1;
			}
			else {
				dp[j][i] = dp[j - 1][ dp[j - 1][i] ];
			}
		}
		maxk = j;
	}
}

int kthAncestor(int x, int k) {
	for (int i = maxk; i >= 0; i--) {
		if ((k & (1 << i)) > 0) {
			x = dp[i][x];
			assert(x != -1);
		}
	}
	return x;
}

int lca(int x, int y) {
	if (lvl[x] < lvl[y]) {
		swap(x, y);
	}
	x = kthAncestor(x, lvl[x] - lvl[y]);
	if (x == y) {
		return x;
	}
	for (int i = maxk; i >= 0; i--) {
		if (dp[i][x] != -1 && dp[i][y] != -1 && dp[i][x] != dp[i][y]) {
			x = dp[i][x];
			y = dp[i][y];
		}
	}
	return dp[0][x];
}

int main() {
//	freopen("date.in", "r", stdin);
//	freopen("date.out","w", stdout);
	
	scanf("%d %d", &N, &M);
	for (int i = 0; i < N - 1; i++) {
		scanf("%d %d", &a, &b);
		a--; b--;
		A[a].push_back(b);
		A[b].push_back(a);
	}
	
	dfs(0, -1);
	precalc();
	
	root = 0;
	while (M--) {
		scanf("%d", &t);
		if (t == 1) {
			scanf("%d", &a);
			a--;
			root = a;
		}
		else {
			scanf("%d %d", &a, &b);
			a--; b--;
			
			int z = lca(a, b);
			int za = lca(root, a);
			int zb = lca(root, b);
			
			if (z == a || z == b) {
				if (z == b) {
					swap(a, b);
					swap(za, zb);
				}
				if (lvl[a] != lvl[za] || zb == b || zb == a) {
					printf("-1\n");
				}
				else {
					printf("%d\n", zb + 1);
				}
				
				continue;
			}
			
			if (za == a || zb == b) {
				printf("-1\n");
				continue;
			}
			
			if (lvl[za] > lvl[z]) {
				printf("%d\n", za + 1);
			}
			else if (lvl[zb] > lvl[z]) {
				printf("%d\n", zb + 1);
			}
			else {
				printf("%d\n", z + 1);
			}
		}
	}
	
	return 0;
}