#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
#define int long long
#define MAXN 1000086
int n,q,tot,dotot;
int ord[MAXN],imp[MAXN],l[MAXN],r[MAXN];
int deep[MAXN],fa[MAXN],size[MAXN],son[MAXN],top[MAXN],id[MAXN],di[MAXN];
struct node
{
int first,next,go;
}p[MAXN];
inline void star(int a,int b)
{
p[++tot].next=p[a].first;
p[a].first=tot;
p[tot].go=b;
}
inline void dfs1(int x,int f)
{
fa[x]=f,deep[x]=deep[f]+1,size[x]=1;
for(int i=p[x].first;i;i=p[i].next)
{
int y=p[i].go;
if(y==f) continue;
dfs1(y,x);
size[x]+=size[y];
if(size[y]>size[son[x]]) son[x]=y;
}
}
inline void dfs2(int x,int topf)
{
id[x]=++dotot,top[x]=topf,di[dotot]=x;
if(!son[x]) return ;
dfs2(son[x],topf);
for(int i=p[x].first;i;i=p[i].next)
{
int y=p[i].go;
if(!top[y]) dfs2(y,y);
}
}
inline void build(int k,int x,int y)
{
l[k]=x,r[k]=y,imp[k]=1e12;
if(x==y) return ;
int mid=(x+y)>>1;
build(k<<1,x,mid);
build(k<<1|1,mid+1,y);
}
inline void update(int k,int x)
{
if(l[k]==r[k])
{
if(imp[k]==1e12) imp[k]=di[x];
else imp[k]=1e12;
return ;
}
if(x<=r[k<<1]) update(k<<1,x);
if(x>=l[k<<1|1]) update(k<<1|1,x);
imp[k]=min(imp[k<<1],imp[k<<1|1]);
}
inline int answer(int k,int x,int y)
{
if(x<=l[k]&&y>=r[k]) return imp[k];
int ans=1e12;
if(x<=r[k<<1]) ans=min(ans,answer(k<<1,x,y));
if(y>=l[k<<1|1]) ans=min(ans,answer(k<<1|1,x,y));
return ans;
}
inline int anschain(int x,int y)
{
int ans=1e12;
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
ans=min(ans,answer(1,id[top[x]],id[x]));
x=fa[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
ans=min(ans,answer(1,id[x],id[y]));
return ans;
}
signed main()
{
scanf("%lld%lld",&n,&q);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
star(x,y);
star(y,x);
}
dfs1(1,0),dfs2(1,1),build(1,1,n);
while(q--)
{
int t,x;
scanf("%lld%lld",&t,&x);
if(t==0) update(1,id[x]);
else
{
int v=anschain(1,x);
if(v==1e12) printf("-1\n");
else printf("%lld\n",v);
}
}
return 0;
}