#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
int x,y,k,opt;
int head[100100],tot;
struct node{
int to,nxt;
}e[200200];
void add1(int x,int y)
{
e[++tot]=(node){y,head[x]};head[x]=tot;
}
int dep[100100],siz[100100],son[100100],fa[100100],dfn[100100],top[100100],cnt,id[100100];
void dfs1(int p,int f)
{
fa[p]=f;siz[p]=1;dep[p]=dep[f]+1;
for(int i=head[p];i;i=e[i].nxt)
{
int k=e[i].to;
if(!dep[k])
{
dfs1(k,p);
siz[p]+=siz[k];
if(siz[k]>siz[son[p]]) son[p]=k;
}
}
}
void dfs2(int p,int t)
{
top[p]=t,dfn[p]=++cnt;id[dfn[p]]=p;
if(!son[p]) return ;
dfs2(son[p],t);
for(int i=head[p];i;i=e[i].nxt){
int k=e[i].to;
if(k!=fa[p]&&k!=son[p]) dfs2(k,k);
}
}
int t[100100<<2],add[100100<<2];
void push_up(int p)
{
t[p]=min(t[p<<1],t[p<<1|1]);
}
void build(int p,int l,int r)
{
add[p]=-1;
if(l==r) {
t[p]=1e9;return ;
}
int mid=l+r>>1;
build(p<<1,l,mid),build(p<<1|1,mid+1,r);
push_up(p);
}
void update(int x,int p,int l,int r)
{
if(l==r) {
if(t[p]==1e9) t[p]=dfn[l];
else t[p]=1e9;
return;
}
int mid=l+r>>1;
if(x<=mid) update(x,p<<1,l,mid);
else update(x,p<<1|1,mid+1,r);
push_up(p);
}
int query(int x,int y,int p,int l,int r)
{
if(x<=l&&r<=y) return t[p];
int mid=l+r>>1,sum=1e9;
if(x<=mid) sum=min(sum,query(x,y,p<<1,l,mid));
if(y>mid) sum=min(sum,query(x,y,p<<1|1,mid+1,r));
return sum;
}
int query_t(int x,int y)
{
int sum=1e9;
while(top[x]^top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
sum=min(sum,query(dfn[top[x]],dfn[x],1,1,n));
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return sum=min(sum,query(dfn[x],dfn[y],1,1,n));
}
signed main()
{
cin>>n>>q;
for(int i=1;i<n;i++){
cin>>x>>y;
add1(x,y),add1(y,x);
}
dfs1(1,0),dfs2(1,1);build(1,1,n);
while(q--)
{
cin>>opt;
if(opt==0)
{
cin>>y;
update(y,1,1,n);
}
else{
cin>>x;
int ans=query_t(1,x);
if(ans==1e9) cout<<-1<<endl;
else cout<<id[ans]<<endl;
}
}
return 0;
}