# include <algorithm>
#include <cstdio>
#include <vector>
#include <cassert>
#define MAXN 100005
#define ARBSIZE 262145
using namespace std;
int n, m, euler[MAXN], ep, start[MAXN], end[MAXN], x, y;
bool color[MAXN];
bool found;
int maxi[MAXN << 2], inc[MAXN << 2];
vector<int> G[MAXN];
void dfs(int node)
{
euler[++ep] = node;
start[node] = ep;
color[node] = 1;
int len = G[node].size();
for (int i = 0 ; i < len ; ++i)
if (color[G[node][i]] == 0)
dfs(G[node][i]);
end[node] = ep;
}
void update(int node, int left, int right, int x, int y)
{
if (start[x] <= left && right <= end[x])
inc[node] += y;
else
{
int mid = (left + right) >> 1;
if (start[x] <= mid)
update(node << 1, left, mid, x, y);
if (end[x] > mid)
update((node << 1) | 1, mid + 1, right, x, y);
}
maxi[node] = max(maxi[node << 1], maxi[(node << 1) | 1]) + inc[node];
}
int query(int node, int left, int right, int x)
{
int ll = 0;
;
if ( (x -= inc[node]) == 0)
{
printf("%d\n", euler[left]);
return 1;
}
if (left != right && x > 0 && maxi[node] - inc[node] >= x)
{
int mid = (left + right) >> 1;
if ((ll = query(node << 1, left, mid, x)) == 0)
ll = query((node << 1) | 1, mid + 1, right, x);
}
x += inc[node];
return ll;
}
int main()
{
assert (freopen("arbore.in", "r", stdin));
assert (freopen("arbore.out","w",stdout));
assert (scanf("%d %d", &n, &m) == 2);
for (int i = 1 ; i < n ; ++i)
{
int a, b;
assert (scanf("%d %d", &a, &b) == 2);
G[a].push_back(b);
G[b].push_back(a);
}
dfs(1);
for (int i = 1 ; i <= m ; ++i)
{
int command;
assert (scanf("%d %d", &command, &x) == 2);
if (command == 1)
{
assert (scanf("%d", &y) == 1);
update(1, 1, n, x, y);
}
else
{
if (!query(1, 1, n, x))
printf("%d\n", -1);
}
}
return 0;
}