#include<fstream>
#include<iostream>
#include<cstdio>
#include<map>
#include<set>
#define FIT(a,b) for(vector<int>::iterator a=b.begin();a!=b.end();a++)
#include<stack>
#define ROF(a,b,c) for(int a=b;a>=c;--a)
#include<vector>
#include<algorithm>
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define REP(a,b) for(register int a=0;a<b;++a)
#include<cstring>
#include<bitset>
#include<cmath>
#include<iomanip>
#include<queue>
#define debug cerr<<"OK";
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ll long long
#define ull unsigned long long
#define mod 31333
#define N 100100
#define M 1000100
#define SQ 350
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");
/*int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};*/
bitset<SQ>ok[M];
vector<int> v[N];
int old[N],lef[N],tip,sum,rig[N],nou[N],t,n,m,x,ls,ld,sqr,dru,nrb,y,buc[SQ],s[N];
void dfs(int x)
{
nou[x]=++t;
old[t]=x;
lef[t]=t;
FIT(it,v[x])
if(!nou[*it])
dfs(*it);
rig[nou[x]]=t;
}
void futel(int buc,int &poz,int val,int dr)
{
ld=min(buc*sqr,n);
dru=min(dr,ld);
FOR(i,poz,dru)
ok[buc][s[i]]=0;
FOR(i,poz,dru)
s[i]+=val;
FOR(i,poz,dru)
ok[buc][s[i]]=1;
poz=dru+1;
}
void upd(int st,int dr,int val)
{
if((st-1)%sqr)
futel((st-1)/sqr+1,st,val,dr);
while(st+sqr-1<=dr)
{
buc[(st-1)/sqr+1]+=val;
st+=sqr;
}
if(st<=dr)
futel((st-1)/sqr+1,st,val,dr);
}
int query(int sum)
{
FOR(i,1,nrb)
if(buc[i]<=sum)
if(ok[i][sum-buc[i]])
FOR(j,(i-1)*sqr+1,min(i*sqr,n))
if(s[j]==sum-buc[i])
return old[j];
return -1;
}
int main ()
{
f>>n>>m;
FOR(i,1,n-1)
{
f>>x>>y;
v[x].pb(y);
v[y].pb(x);
}
dfs(1);
sqr=(int)sqrt(n);
nrb=n/sqr;
if(n%sqr)
nrb++;
FOR(i,1,nrb)
{
ok[i][0]=1;
}
FOR(i,1,m)
{
f>>tip;
--tip;
if(!tip)
{
f>>x>>y;
x=nou[x];
upd(lef[x],rig[x],y);
}
else
{
f>>sum;
g<<query(sum)<<"\n";
}
}
return 0;
}
//Look at me! Look at me! The monster inside me has grown this big!