#include<cstdio>
#define N 100009
inline int read()
{
register int ret = 0;
register bool f = 1;
register char ch = getchar();
while (ch < '0' || ch > '9')
(ch == '-') ? f = 0 : 0, ch = getchar();
while (ch >= '0' && ch <= '9')
ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
return f ? ret : -ret;
}
int fa[N], top[N], dep[N], siz[N], dfn[N], whe[N], tot, hson[N];
struct node
{
int v, nxt;
}e[N << 1];
int head[N], cnt;
inline void add(int u, int v)
{
e[++ cnt].v = v, e[cnt].nxt = head[u], head[u] = cnt;
}
void dfs1(register int u, register int fath = 0)
{
fa[u] = fath;
dep[u] = dep[fath] + 1;
siz[u] = 1;
register int v, i;
for (i = head[u];i;i = e[i].nxt)
{
v = e[i].v;
if (v != fath)
{
dfs1(v, u);
siz[u] += siz[v];
if (siz[v] > siz[hson[u]])
hson[u] = v;
}
}
}
void dfs2(register int u, register int topf)
{
top[u] = topf;
dfn[u] = ++ tot;
whe[tot] = u;
if (!hson[u])
return;
dfs2(hson[u], topf);
register int i, v;
for (i = head[u];i;i = e[i].nxt)
{
v = e[i].v;
if (v != fa[u] && v != hson[u])
dfs2(v, v);
}
}
int tr[N << 2];
#define max(a, b) (a > b ? a : b)
#define min(a, b) (a < b ? a : b)
void build(register int l, register int r, register int p = 1)
{
tr[p] = 1e9;
if (l == r)
return;
register int mid = (l + r) >> 1;
build(l, mid, p << 1);
build(mid + 1, r, (p << 1) | 1);
}
void updata(register int sx, register int l, register int r, register int p = 1)
{
if (l == r)
{
if (tr[p] == 1e9)
tr[p] = sx;
else
tr[p] = 1e9;
return;
}
register int mid = (l + r) >> 1;
if (sx <= mid)
updata(sx, l, mid, p << 1);
else
updata(sx, mid + 1, r, (p << 1) | 1);
tr[p] = min(tr[p << 1], tr[(p << 1) | 1]);
}
int query(register int sl, register int sr, register int l, register int r, register int p = 1)
{
if (l >= sl && r <= sr)
return tr[p];
register int mid = (l + r) >> 1, ret = 1e9;
if (sl <= mid)
ret = query(sl, sr, l, mid, p << 1);
if (sr > mid)
ret = min(ret, query(sl, sr, mid + 1, r, (p << 1) | 1));
return ret;
}
int main()
{
register int n = read(), m = read(), u, v, i, ret;
for (i = 1;i < n;++ i)
u = read(), v = read(), add(u, v), add(v, u);
dfs1(1);
dfs2(1, 1);
build(1, n);
for (i = 1;i <= m;++ i)
{
u = read(), v = read();
if (!u)
updata(dfn[v], 1, n);
else
{
ret = 1e9;
while (top[v] != 1)
{
ret = min(ret, query(dfn[top[v]], dfn[v], 1, n));
v = fa[top[v]];
}
ret = min(ret, query(1, dfn[v], 1, n));
if (ret == 1e9)
puts("-1");
else
printf("%d\n", whe[ret]);
}
}
return 0;
}