#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((pl+pr)>>1)
const int N=100005;
const int M=200005;
const int inf=0x3f3f3f3f;
int n,q,siz[N],top[N],son[N],dep[N],f[N],dfn[N],num,t[N<<2],a[N],id[N];
struct edge{
int next,v;
}e[M];
int head[N],cnt;
void addedge(int u,int v){
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dfs1(int i,int fa){
f[i]=fa,dep[i]=dep[fa]+1,siz[i]=1;
for(int j=head[i];j;j=e[j].next){
int v=e[j].v;
if(v==fa)continue;
dfs1(v,i);
siz[i]+=v;
if(siz[son[i]]<siz[v])son[i]=v;
}
}
void dfs2(int i,int topf){
top[i]=topf;
dfn[i]=++num;id[num]=i;
if(son[i])dfs2(son[i],topf);
for(int j=head[i];j;j=e[j].next){
int v=e[j].v;
if(v==f[i]||v==son[i])continue;
dfs2(v,v);
}
}
void pushup(int p){
t[p]=min(t[ls],t[rs]);
}
void build(int p,int pl,int pr){
if(pl==pr){
t[p]=inf;
return;
}
build(ls,pl,mid);
build(rs,mid+1,pr);
pushup(p);
}
void update(int pos,int p,int pl,int pr,int w){
if(pl==pr){
t[p]=w;
return;
}
if(pos<=mid)update(pos,ls,pl,mid,w);
else update(pos,rs,mid+1,pr,w);
pushup(p);
}
int query(int l,int r,int p,int pl,int pr){
if(l<=pl&&pr<=r){
return t[p];
}
int ret=inf;
if(l<=mid)ret=min(ret,query(l,r,ls,pl,mid));
if(r>mid)ret=min(ret,query(l,r,rs,mid+1,pr));
return ret;
}
int ask(int i,int j){
int ret=inf;
while(top[i]^top[j]){
if(dep[top[i]]<dep[top[j]])swap(i,j);
ret=min(ret,query(dfn[top[i]],dfn[i],1,1,n));
i=f[top[i]];
}
if(dep[i]>dep[j])swap(i,j);
ret=min(ret,query(dfn[i],dfn[j],1,1,n));
return ret;
}
int main(){
n=read(),q=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
addedge(u,v),addedge(v,u);
}
dfs1(1,0);dfs2(1,1);build(1,1,n);
while(q--){
int op=read(),i=read();
if(op==0){
if(!a[i])update(dfn[i],1,1,n,dfn[i]),a[i]=1;
else update(dfn[i],1,1,n,inf),a[i]=0;
}else{
int ans=ask(1,i);
if(ans>1e9)puts("-1");
else cout<<id[ans]<<"\n";
}
}
return 0;
}