#include <bits/stdc++.h>
using namespace std;
const int rad=316;
struct bucket
{
int s;
bitset<1000001> vaz;
}buk[rad+10];
int first[100010],euler[100010],last[100010],l,nrbuk[100010],val[100010];
vector<int> v[100010];
void dfs(int nod,int tata)
{
euler[++l]=nod;
first[nod]=l;
for(int i=0;i<v[nod].size();i++)
if(v[nod][i]!=tata) dfs(v[nod][i],nod);
last[nod]=l;
}
void update(int poz,int st,int dr,int s)
{
int l1=(poz-1)*rad+1,r1=min(poz*rad,l);
for(int i=l1;i<=r1;i++) buk[poz].vaz[val[i]]=0;
for(int i=st;i<=dr;i++) val[i]+=s;
for(int i=l1;i<=r1;i++) buk[poz].vaz[val[i]]=1;
}
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
int n,m,x,y,tip;
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1,0);
int nrb=0;
for(int i=1;i<=l;i++)
{
if((i-1)%rad==0) nrb++;
nrbuk[i]=nrb;
buk[nrb].vaz[0]=1;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&tip);
if(tip==1)
{
scanf("%d%d",&x,&y);
int a=nrbuk[first[x]],b=nrbuk[last[x]];
for(int j=a+1;j<b;j++) buk[j].s+=y;
if(a==b) update(a,first[x],last[x],y);
else
{
update(a,first[x],a*rad,y);
update(b,(b-1)*rad+1,last[x],y);
}
}
else
{
scanf("%d",&x);
int sol=-1;
for(int i=1;i<=nrb;i++)
if(x-buk[i].s>=0 && buk[i].vaz[x-buk[i].s]==1)
{
int l1=(i-1)*rad+1,r1=min(i*rad,l);
for(int j=l1;j<=r1;j++)
if(val[j]==x-buk[i].s) {sol=euler[j];break;}
break;
}
printf("%d\n",sol);
}
}
return 0;
}