#include <bits/stdc++.h>
using namespace std;
#define pub push_back
#define fs first
#define sc second
void debug();
const int MAXN = 100010;
int n, m, found;
int st, dr, ordPos = 0;
int deg[MAXN], linear[MAXN];
long long tree[8 * MAXN];
vector<int> sons[MAXN];
pair<int, int> ord[MAXN];
void liniarise(int nod) {
deg[nod] = 0;
ord[nod].fs = ++ordPos;
linear[ordPos] = nod;
for(auto it: sons[nod]) {
if(deg[it])
liniarise(it);
}
ord[nod].sc = ordPos;
}
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(found > 0)
return 0;
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);
}
for(int i = 1; i <= n; ++i)
deg[i] = 1;
liniarise(1);
for(int i = 0; i < m; ++i) {
scanf("%d%d", &t, &p);
if(t == 1) {
scanf("%d", &s);
st = ord[p].fs, dr = ord[p].sc;
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(int i = 1; i <= n; ++i)
cerr << linear[i] << " ";
cerr << "\n";
for(int i = 1; i <= n; ++i) {
cerr << i << ": (" << ord[i].fs << ", " << ord[i].sc << ");\n";
}
// for(int i = 1; i < 16; ++i) {
// cerr << tree[i] << " ";
// }
cerr << "\n___\n\n";
}
int main() {
read();
//debug();
return 0;
}