#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 1;

int n, q;
vector<int> adj[N];

int sz[N], dep[N], par[N], heavy[N];
int head[N], rev[N], pos[N], curPos;

void dfs(int u, int parent) {
   sz[u] = 1;
   par[u] = parent;
   for (int v : adj[u]) {
      if (v == parent) continue;
      dep[v] = dep[u] + 1;
      dfs(v, u);
      sz[u] += sz[v];
      if (sz[v] > sz[heavy[u]]) heavy[u] = v;
   }
}

void decompose(int u, int h) {
   head[u] = h;
   pos[u] = ++curPos;
   rev[curPos] = u;
   if (heavy[u] != 0) decompose(heavy[u], h);
   for (int v : adj[u]) {
      if (v == par[u] || heavy[u] == v) continue;
      decompose(v, v);
   }
}

int st[4 * N];

void update(int id, int l, int r, int pos) {
   if (l == r) {
      st[id] ^= 1;
      return;
   }
   if (pos <= (l + r) / 2) update(id << 1, l, (l + r) / 2, pos);
   else update(id << 1 | 1, (l + r) / 2 + 1, r, pos);
   st[id] = st[id << 1] + st[id << 1 | 1];
}

int walk(int id, int l, int r, int x, int y) {
   if (r < x || y < l) return -1;
   if (st[id] == 0) return -1;
   if (l == r) return l;
   int left = walk(id << 1, l, (l + r) / 2, x, y);
   if (left != -1) return left;
   return walk(id << 1 | 1, (l + r) / 2 + 1, r, x, y);
}

int queryPath(int v) {
   stack<pair<int,int>> st; 
   while (dep[head[v]] > dep[1]) {
      st.emplace(pos[head[v]], pos[v]);
      v = par[head[v]];
   }
   st.emplace(1, pos[v]);
   while (st.size()) {
      auto [l, r] = st.top(); st.pop();
      int res = walk(1, 1, n, l, r);
      if (res != -1) return rev[res];
   }
   return -1;
}

void solve() {
   cin >> n >> q;
   for (int i = 1; i < n; ++i) {
      int u, v; cin >> u >> v;
      adj[u].push_back(v);
      adj[v].push_back(u);
   }
   dfs(1, 0);
   decompose(1, 1);
   while (q--) {
      int t, u; cin >> t >> u;
      if (t & 1) cout << queryPath(u) << '\n';
      else update(1, 1, n, pos[u]);
   }
}

int main() {
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr), cout.tie(nullptr);
   solve();
   return 0;
}