#include <stdio.h>
#include <vector>
#include <math.h>
#include <bitset>
#include <assert.h>
#define NMax 100010
#define SNMax 400
using namespace std;
const char IN[]="arbore.in",OUT[]="arbore.out";
const int mod= (1<<10);
const int mmod= mod-1;
const int prime=13;
int N,M,psize;
int Min[NMax] , Max[NMax] , v[NMax] , s[NMax] , csum[NMax];
bool visit[NMax];
bitset<NMax> b[SNMax];
vector<int> ad[NMax];
void Update(int x,int y,int val)
{
int poz , px , py , i;
for (poz=1,px=1,py=psize;px<=N;px+=psize,py+=psize,++poz)
{
if ( x<=px && py<=y ) csum[poz]+=val;
else if ( x<=px && px<=y && y<=py)
{
for (i=px;i<=py && i<=N;++i) b[poz][s[i]]=0;
for (i=px;i<=y;++i) s[i]+=val;
for (i=px;i<=py && i<=N;++i) b[poz][s[i]]=1;
}
else if ( px<=x && x<=py && py<=y )
{
for (i=px;i<=py && i<=N;++i) b[poz][s[i]]=0;
for (i=x;i<=py;++i) s[i]+=val;
for (i=px;i<=py && i<=N;++i) b[poz][s[i]]=1;
}
}
}
void init()
{
int poz , px , py , i;
for (poz=1,px=1,py=psize;px<=N;px+=psize,py+=psize,++poz)
b[poz][0]=1;
}
int Query(int S)
{
int poz , px , py , i;
for (poz=1,px=1,py=psize;px<=N;px+=psize,py+=psize,++poz)
if ( S-csum[poz]>=0 && b[poz][S-csum[poz]])
{
for (i=px;i<=py;++i) if (s[i]+csum[poz]==S) return v[i];
assert(0);
}
return -1;
}
void dfs(int x=1)
{
int i;
static int time;
visit[x]=true;
Min[x]=++time;v[time]=x;
for (i=0;i<(int)ad[x].size();++i) if (!visit[ad[x][i]])
dfs(ad[x][i]);
Max[x]=time;
}
int main()
{
int i,c,x,y;
freopen(IN,"r",stdin);
scanf("%d%d",&N,&M); psize= int( sqrt(N) + 0.5 );
for (i=1;i<N;++i) scanf("%d%d",&x,&y),ad[x].push_back(y),ad[y].push_back(x);
dfs();
init();
freopen(OUT,"w",stdout);
while (M--)
{
scanf("%d",&c);
switch(c)
{
case 1:
{
scanf("%d%d",&x,&y);
Update(Min[x],Max[x],y);
}
break;
case 2:
{
scanf("%d",&x);
printf("%d\n",Query(x));
}
break;
}
}
return 0;
}