#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#define sz 100000
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
vector <int> vec[sz + 5];
int n;
int m;
int fr[sz + 5];
int lt[sz + 5];
int iv[sz*2 + 5];
int v[sz*2 + 5];
int o;
unordered_map<int,int> f[600];
int s[600];
int lg;
int bsz;
inline int bk(int ind)
{
return ind/lg + (ind%lg!=0);
}
inline int get_b_start(int b_id)
{
return (b_id-1)*lg + 1;
}
void dfs(int nod,int p)
{
fr[nod]=++o;
iv[o]=nod;
for(auto& i : vec[nod])
if(i!=p)
dfs(i,nod);
lt[nod]=++o;
iv[o]=nod;
}
void update(int st,int dr,int val)
{
int bst = bk(st);
int bdr = bk(dr);
if(bst==bdr)
{
for(int i = st;i<=dr;i++)
{
f[bst][v[i]]--;
if(f[bst][v[i]]<=0)
f[bst].erase(v[i]);
v[i]+=val;
f[bst][v[i]]++;
}
return;
}
for(int i = st;i<get_b_start(bst+1);i++)
{
f[bst][v[i]]--;
if(f[bst][v[i]]<=0)
f[bst].erase(v[i]);
v[i]+=val;
f[bst][v[i]]++;
}
for(int x = bst+1;x<bdr;x++)
s[x]+=val;
for(int i = get_b_start(bdr);i<=dr;i++)
{
f[bdr][v[i]]--;
if(f[bdr][v[i]]<=0)
f[bdr].erase(v[i]);
v[i]+=val;
f[bdr][v[i]]++;
}
}
int query(int val)
{
int sol = -1;
for(int i = 1;i<=bsz; i++)
if(f[i].find(val-s[i])!=f[i].end())
{
for(int x = get_b_start(i);x<get_b_start(i+1);x++)
if(v[x] + s[i]==val)
return iv[x];
}
return sol;
}
int main()
{
fin>>n>>m;
for(int i=1;i<n;i++)
{
int x,y;
fin>>x>>y;
vec[x].push_back(y);
vec[y].push_back(x);
}
dfs(1,0);
lg=sqrt(o);
bsz=o/lg + (o%lg!=0);
for(int i=1;i<=o;i++)
f[bk(i)][0]++;
for(int i=1;i<=m;i++)
{
int tp;
fin>>tp;
if(tp==1)
{
int p,s;
fin>>p>>s;
update(fr[p],lt[p],s);
}
else
{
int s;
fin>>s;
fout<<query(s)<<'\n';
}
}
}