#include <bits/stdc++.h>
using namespace std;
#define pub push_back
void debug();
const int MAXN = 100010;
int n, m, father, found;
int st, dr;
int deg[MAXN], totsize[MAXN];
long long tree[8 * MAXN];
vector<int> sons[MAXN], linear;
void liniarise(int nod) {
deg[nod] = 0;
linear.pub(nod);
totsize[nod] = sons[nod].size();
for(auto it: sons[nod]) {
if(deg[it])
liniarise(it);
totsize[nod] += totsize[it];
}
}
void updateNod(int nod) {
tree[nod] = max(tree[(nod << 1)], tree[(nod << 1) + 1]);
}
void treeInsert(int nod, int l, int r, int val) {
if(l == r) {
tree[nod] += val;
return;
}
int mid = l + (r - l)/2;
if(st <= mid)
treeInsert( (nod << 1), l, mid, val);
if(mid < dr)
treeInsert( (nod << 1) + 1, mid + 1, r, val);
updateNod(nod);
}
int treeQuery(int nod, int l, int r, int p) {
if(l == r) {
if(tree[nod] == p)
found = l;
return l;
}
if(tree[nod] < p) {
return 0;
}
int mid = l + (r - l)/2;
if(st <= mid && found == -1)
treeQuery((nod << 1), l, mid, p);
if(mid <= dr && found == -1)
treeQuery((nod << 1) + 1, mid + 1, r, p);
return l;
}
void read() {
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
int x, y;
int t, p, s;
scanf("%d%d", &n, &m);
for(int i = 1; i < n; ++i) {
scanf("%d%d", &x, &y);
sons[x].pub(y);
deg[y]++;
}
for(int i = 1; i <= n; ++i)
if(!deg[i]) {
father = i;
break;
}
linear.pub(0);
liniarise(father);
for(int i = 0; i < m; ++i) {
scanf("%d%d", &t, &p);
if(t == 1) {
scanf("%d", &s);
st = p, dr = st + totsize[p];
treeInsert(1, 1, n, s);
} else {
st = 1, dr = n; found = -1;
treeQuery(1, 1, n, p);
printf("%d\n", (found == -1) ? -1 : linear[found]);
}
}
}
void debug() {
// for(auto it: linear)
// cerr << it << " ";
// cerr << totsize[2];
for(int i = 1; i < 16; ++i) {
cerr << tree[i] << " ";
}
cerr << "\n___\n\n";
}
int main() {
read();
//debug();
return 0;
}