#include <cstdio>
#include <cmath>
#include <vector>
#define nmax 100015
#define vmax 1000015
#define sqmax 350
using namespace std;
int n, m, sq, pf [nmax], pb [nmax], a [sqmax], k [nmax], e [nmax];
vector <vector <bool> > v (sqmax, vector <bool> (vmax) );
vector <int> arb [nmax];
vector <bool> viz (nmax);
void dfs (int k)
{
viz [k]=true;
int i;
pf [k]=++e [0];
e [e [0]]=k;
for (i=0; i != arb [k].size (); ++i)
if (viz [arb [k] [i]] == false)
dfs (arb [k] [i]);
pb [k]=e [0];
}
inline void set0 (int x)
{
int i, r;
for (i=x*sq, r=0; r != sq; ++i, ++r)
v [x] [k [i]]=false;
}
void update (int p, int s)
{
int x, y, r, r1, r2, i;
x=pf [p]/sq;
r1=pf [p]%sq;
y=pb [p]/sq;
r2=pb [p]%sq;
if (x == y)
{
set0 (x);
for (i=x*sq, r=0; r != sq; ++i, ++r)
{
if (i > n) break;
if (r >= r1 && r <= r2) k [i]+=s;
v [x] [k [i]]=true;
}
return;
}
i=x;
if (r1) ++i;
for (; i < y; ++i) a [i]+=s;
if (r2 == sq-1) a [y]+=s;
if (r1)
{
set0 (x);
for (i=x*sq, r=0; r != sq; ++i, ++r)
{
if (i > n) break;
if (r >= r1) k [i]+=s;
v [x] [k [i]]=true;
}
}
if (r2 != sq-1)
{
set0 (y);
for (i=y*sq, r=0; r != sq; ++i, ++r)
{
if (i > n) break;
if (r <= r2) k [i]+=s;
v [y] [k [i]]=true;
}
}
}
int query (int s)
{
int x, i, j;
for (x=0; x <= sq+1; ++x)
if (s >= a [x] && v [x] [s-a [x]] == true)
{
for (j=x*sq; 1; ++j)
if (k [j] == s-a [x]) return e[j];
}
return -1;
}
int main ()
{
freopen ("arbore.in", "r", stdin);
freopen ("arbore.out", "w", stdout);
int i, x, y, tip;
scanf ("%d%d", &n, &m);
for (i=1; i < n; ++i)
{
scanf ("%d%d", &x, &y);
arb [x].push_back (y);
arb [y].push_back (x);
}
dfs (1);
// for (i=1; i <= e [0]; ++i) fprintf (stderr, "%d %d %d\n", i, pf [i], pb [i]);
sq=sqrt (n);
if (sq*sq < n) ++sq;
for (i=0; i <= sq+1; ++i) v [i] [0]=true;
for (i=1; i <= m; ++i)
{
scanf ("%d%d", &tip, &x);
if (tip == 1)
{
scanf ("%d", &y);
update (x, y);
}
else
printf ("%d\n", query (x));
}
return 0;
}