#include <stdio.h>
#include <vector>
#include <math.h>
#include <string.h>
using namespace std;
#define maxn 100010
#define mrad 340
#define maxnr 1000410
#define pb push_back
long n, i, j, k, m, a, b, rad, poz, nr, tip, cat, l;
long st[maxn], dr[maxn], parc[maxn], f[maxnr], be[mrad], en[mrad], val[maxn];
long ad[mrad], qq[mrad][maxnr/30];
vector<long> v[maxn];
long max(long a, long b)
{
if(a<b) return b;
return a;
}
long min(long a, long b)
{
if(a<b) return a;
return b;
}
void df(long nod)
{
long y, fiu;
f[nod]=1;
st[nod]=l+1;
for(y=0; y<v[nod].size(); y++)
{
fiu=v[nod][y];
if(f[fiu]==0) df(fiu);
}
parc[++l]=nod;
dr[nod]=l;
}
/*void update(long nod, long cat)
{
long left=st[nod];
long right=dr[nod];
for(i=1; i<=nr; i++)
{
if(left<=be[i] && en[i]<=right)
{
ad[i]+=cat;
}
else
if((be[i]<=left && left<=en[i]) || (be[i]<=right && right<=en[i]))
{
memset(f, 0, sizeof(f));
for(j=be[i]; j<=en[i]; j++)
{
f[val[j]]++;
}
for(j=max(be[i], left); j<=min(right, en[i]); j++)
{
f[val[j]]--;
if(!f[val[j]])
{
qq[i][val[j]/30]-=(1<<(val[j]%30));
}
val[j]+=cat;
f[val[j]]++;
if(f[val[j]]==1)
{
qq[i][val[j]/30]-=(1<<(val[j]%30));
}
}
}
}
}*/
long querry(long cat)
{
long caut;
for(i=1; i<=nr; i++)
{
caut=cat-ad[i];
if(((qq[i][caut/30])>>(caut%30))&1)
{
for(j=be[i]; j<=en[i]; j++)
{
if(val[j]==caut)
{
return parc[j];
}
}
}
}
return -1;
}
int main()
{
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
scanf("%d%d", &n, &m);
rad=(long)sqrt(n);
for(i=1; i<n; i++)
{
scanf("%d%d", &a, &b);
v[a].pb(b);
v[b].pb(a);
}
df(1);
for(i=1, poz=rad; poz<n; poz+=rad, i++)
{
be[i]=poz-rad+1;
en[i]=poz;
qq[i][0]=1;
}
be[i]=poz-rad+1;
en[i]=n;
qq[i][0]=1;
nr=i;
for(i=1; i<=nr; i++)
{
printf("%d %d\n", be[i], en[i]);
}
while(m--)
{
scanf("%d", &tip);
if(tip==1)
{
scanf("%d%d", &a, &cat);
// update(a, cat);
}
else
{
scanf("%d", &cat);
printf("%d\n", querry(cat));
}
}
return 0;
}