#include <cstdio>
#include <vector>
#include <bitset>
using namespace std;
#define pb push_back
FILE *in,*out;
const int rad=316;
int v[100005],nrb,timp,start[100005],stop[100005],val[100005],b[100005],n,nod[100005];
vector<int> a[100005];
bitset<1000005> cnt[320];
void dfs(int x)
{
v[x]=1;
int i;
timp++;
stop[x]=start[x]=timp;
val[timp]=0;
nod[timp]=x;
for (i=0;i<a[x].size();i++)
if (!v[a[x][i]])
{
dfs(a[x][i]);
stop[x]=timp;
}
}
void regenerez(int t,int x,int y,int x2,int y2,int z)
{
int i;
for (i=x;i<=y&&i<=n;i++)
{
cnt[t][val[i]]=0;
val[i]+=z;
}
for (i=x2;i<=y2&&i<=n;i++)
cnt[t][val[i]]=1;
}
void update(int x,int y,int z)
{
int bx=x/rad+1;
int startx=(bx-1)*rad;
int by=y/rad+1;
int starty=(by-1)*rad;
int i;
if (bx==by)
{
regenerez(bx,x,y,startx,startx+rad-1,z);
}
else
{
regenerez(bx,x,startx+rad-1,startx,startx+rad-1,z);
regenerez(by,starty,y,starty,starty+rad-1,z);
}
for (i=bx+1;i<by;i++)
b[i]+=z;
}
int query(int x)
{
int i,j;
for (i=1;i<=nrb;i++)
if (b[i]<=x&&cnt[i][x-b[i]])
{
for (j=(i-1)*rad;j<rad*i&&j<=n;j++)
if (j&&val[j]+b[i]==x)
return nod[j];
}
return -1;
}
int main()
{
int i,tip,x,y,m;
in=fopen("arbore.in","r");
out=fopen("arbore.out","w");
fscanf(in,"%d%d",&n,&m);
for (i=1;i<n;i++)
{
fscanf(in,"%d%d",&x,&y);
a[x].pb(y);
a[y].pb(x);
}
dfs(1);
nrb=n/rad + (n%rad?1:0);
for (i=1;i<=nrb;i++)
cnt[i][0]=1;
for (i=1;i<=m;i++)
{
fscanf(in,"%d",&tip);
if (tip==1)
{
fscanf(in,"%d%d",&x,&y);
update(start[x],stop[x],y);
}
if (tip==2)
{
fscanf(in,"%d",&x);
fprintf(out,"%d\n",query(x));
}
}
fclose(in);
fclose(out);
return 0;
}