#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];
int tree[8 * MAXN], treeMax[8 * MAXN];
vector<int> sons[MAXN];
pair<int, int> ord[MAXN];
void liniarise(int nod, int fn) {
deg[nod] = 1;
ord[nod].fs = ++ordPos;
linear[ordPos] = nod;
for(auto it: sons[nod]) {
if(!deg[it] && it != fn)
liniarise(it, nod);
}
ord[nod].sc = ordPos;
}
void treeInsert(int nod, int l, int r, int val) {
if(st <= l && r <= dr) {
tree[nod] += val;
treeMax[nod] = tree[nod] + max(tree[(nod<<1)], tree[(nod<<1)+1]);
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);
treeMax[nod] = tree[nod] + max(treeMax[(nod << 1)], treeMax[(nod << 1) + 1]);
}
void treeQuery(int nod, int l, int r, int p) {
if(found > 0)
return;
if(tree[nod] == p) {
found = linear[l];
return;
}
if(l < r && treeMax[nod] >= p && tree[nod] < p) {
int mid = l + (r - l)/2;
treeQuery((nod << 1), l, mid, p - tree[nod]);
treeQuery((nod << 1) + 1, mid + 1, r, p - tree[nod]);
}
}
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);
sons[y].pub(x);
}
liniarise(1, 0);
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, ordPos, s);
} else {
st = 1, dr = n; found = -1;
treeQuery(1, 1, ordPos, p);
printf("%d\n", 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;
}