#include <bits/stdc++.h>
using namespace std;
const int NRB = 317;
const int MAXN = 100000;
int vin[MAXN + 1], vout[MAXN + 1], ord[MAXN], par[MAXN + 1], vlazy[NRB], v[MAXN];
unordered_map<int, int> fr[NRB];
vector<int> adj[MAXN + 1];
int time1;
void dfs(int nod) {
int nr, i, x;
time1++;
vin[nod] = time1;
ord[time1] = nod;
nr = adj[nod].size();
for (i = 0; i < nr; i++) {
x = adj[nod][i];
if (par[x] < 0) {
par[x] = nod;
dfs(x);
}
}
vout[nod] = time1;
}
void add(int x, int s, int nb) {//poz, suma, bucket
fr[nb][v[x]]--;
if (fr[nb][v[x]] == 0) {
fr[nb].erase(v[x]);
}
v[x] += s;
fr[nb][v[x]]++;
}
int minim(int a, int b) {
return a < b ? a : b;
}
int maxim(int a, int b) {
return a > b ? a : b;
}
int main()
{
FILE *fin, *fout;
//cu sqrt decomp si tin lazy pe un bucket cu cat am adunat
//si daca trebuie x si am adunat y pe bucket vad daca exista in el un x - y
int n, q, i, x, y, st, dr, p, s, b, nrb, j, cer, c, rez, i1;
fin = fopen("arbore.in", "r");
fscanf(fin, "%d%d", &n, &q);
for (i = 0; i < n - 1; i++) {
fscanf(fin, "%d%d", &x, &y);
adj[x].push_back(y);
adj[y].push_back(x);
par[i + 2] = -1;
}
time1 = -1;
dfs(1);
b = sqrt(n);
nrb = 0;
for (i = 0; i < n; i++) {
j = i + b;
if (j > n) {
j = n;
}
fr[nrb][0] += (j - i);
nrb++;
}
fout = fopen("arbore.out", "w");
for (i1 = 0; i1 < q; i1++) {
fscanf(fin, "%d", &cer);
if (cer == 1) {
fscanf(fin, "%d%d", &p, &s);
st = vin[p];
dr = vout[p];
x = (st / b);
y = (dr / b);
if (x == y) {
for (j = st; j <= dr; j++) {
add(j, s, x);
}
} else {
c = minim((x + 1) * b, n);
for (j = st; j < c; j++) {
add(j, s, x);
}
for (j = dr; j >= y * b; j--) {
add(j, s, y);
}
for (x++; x < y; x++) {
//adaug lazy s pe interval
vlazy[x] += s;
}
}
} else {
fscanf(fin, "%d", &s);
x = i = rez = 0;
while (i < n && rez == 0) {
if (fr[x].count(s - vlazy[x]) > 0) {
j = i;
while (v[j] != s - vlazy[x]) {
j++;
}
fprintf(fout, "%d\n", ord[j]);
rez = 1;
}
i += b;
x++;
}
if (rez == 0) {
fprintf(fout, "-1\n");
}
}
}
fclose(fin);
fclose(fout);
return 0;
}