#include<bits/stdc++.h>
#define maxN 100005
using namespace std;
const int rp=350;
multiset<int> Set[rp];
int vect[maxN],dv;
bool seen[maxN];
vector<int> v[maxN];
int depth[maxN];
inline void dfs(int nod)
{
vect[++dv]=nod;
seen[nod]=1;
for(auto it:v[nod])
{
if(!seen[it])
{
depth[it]=1+depth[nod];
dfs(it);
}
}
}
int val[maxN],n,m,x,y,nbucket;
inline void Search(int bucket,int y)
{
int start,finish;
start=rp*(bucket-1)+1;
finish=rp*bucket;
for(int i=start;i<=finish;i++)
if(val[i]==y)
{
printf("%d\n",vect[i]);
return ;
}
}
int add[rp],pos[maxN],vf,st[maxN],op,p,dr[maxN],bucket,vl;
int main()
{
freopen("arbore.in","r",stdin);
freopen("arbore.out","w",stdout);
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);
}
nbucket=n/rp;
if(n%rp) nbucket++;
dfs(1);
for(int i=1;i<=dv;i++)
{
pos[vect[i]]=i;
if(vf && depth[vect[st[vf]]]>=depth[i])
{
dr[vect[st[vf]]]=i-1;
vf--;
}
st[++vf]=i;
}
while(vf)
{
dr[vect[st[vf]]]=n;
vf--;
}
for(int i=1;i<=n;i++)
{
bucket=i/rp;
if(i%rp) bucket++;
Set[bucket].insert(0);
}
memset(seen,0,sizeof(seen));
for(int i=1;i<=m;i++)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&x,&y);
p=pos[x];
int xbucket=p/rp;
if(p%rp) xbucket++;
int ybucket=dr[x]/rp;
if(dr[x]%rp) ybucket++;
for(int bucket=xbucket+1;bucket<ybucket;bucket++)
{
if(add[bucket]>1000000) continue;
add[bucket]+=y;
}
if(xbucket==ybucket)
{
for(int j=p;j<=dr[x];j++)
{
if(seen[j]) continue;
multiset<int>::iterator it=Set[xbucket].lower_bound(val[j]);
Set[xbucket].erase(it);
if((add[xbucket]+val[j]+y)<=1000000)
{
Set[xbucket].insert(val[j]+y);
val[j]+=y;
}
else seen[j]=1;
}
continue;
}
for(int j=p;j<=rp*xbucket;j++)
{
if(seen[j]) continue;
multiset<int>::iterator it=Set[xbucket].lower_bound(val[j]);
Set[xbucket].erase(it);
if((add[xbucket]+val[j]+y)<=1000000)
{
Set[xbucket].insert(val[j]+y);
val[j]+=y;
}
else seen[j]=1;
}
for(int j=rp*(ybucket-1)+1;j<=dr[x];j++)
{
if(seen[j]) continue;
multiset<int>::iterator it=Set[ybucket].lower_bound(val[j]);
Set[ybucket].erase(it);
if((add[ybucket]+val[j]+y)<=1000000)
{
Set[ybucket].insert(val[j]+y);
val[j]+=y;
}
else seen[j]=1;
}
}
else
if(op==2)
{
scanf("%d",&vl);
for(int j=1;j<=nbucket;j++)
{
int y=vl-add[j];
if(y<0)
{
printf("-1\n");
continue;
}
multiset<int>::iterator it=Set[j].lower_bound(y);
if(it!=Set[j].end() && *it==y)
{
Search(j,y);
break;
}
printf("-1\n");
}
}
}
return 0;
}