#include <bits/stdc++.h>
using namespace std;
int n, Q;
char opt[400010];
vector<int> G[400010];
int col[400010], cnt;
struct tnode {
  int ch[2], fa, sz, tag;
} t[400010];
int tr[400010];
int lowbit(int x) { return x & (-x); }
void update(int x, int y) {
  for (; x <= n + Q; x += lowbit(x)) tr[x] += y;
}
int ask(int x) {
  int ret = 0;
  for (; x; x -= lowbit(x)) ret += tr[x];
  return ret;
}
int idnrt(int x) { return (t[t[x].fa].ch[0] == x) || (t[t[x].fa].ch[1] == x); }
int idc(int x) { return (t[t[x].fa].ch[1] == x); }
void pushup(int p) { t[p].sz = t[t[p].ch[0]].sz + t[t[p].ch[1]].sz + 1; }
void reverse(int p) {
  swap(t[p].ch[0], t[p].ch[1]);
  t[p].tag ^= 1;
}
void pushdown(int p) {
  if (t[p].ch[0]) col[t[p].ch[0]] = col[p];
  if (t[p].ch[1]) col[t[p].ch[1]] = col[p];
  if (!t[p].tag) return;
  if (t[p].ch[0]) reverse(t[p].ch[0]);
  if (t[p].ch[1]) reverse(t[p].ch[1]);
  t[p].tag = 0;
}
void rotate(int p) {
  int fa = t[p].fa, gfa = t[fa].fa;
  int sid = idc(p), fid = idc(fa);
  int ots = t[p].ch[sid ^ 1];
  if (idnrt(fa)) t[gfa].ch[fid] = p;
  t[p].ch[sid ^ 1] = fa;
  t[fa].ch[sid] = ots;
  if (ots) t[ots].fa = fa;
  t[fa].fa = p;
  t[p].fa = gfa;
  pushup(fa);
  pushup(p);
}
void maintain(int p) {
  if (idnrt(p)) maintain(t[p].fa);
  pushdown(p);
}
void splay(int p) {
  maintain(p);
  while (idnrt(p)) {
    int fa = t[p].fa;
    if (!idnrt(fa))
      rotate(p);
    else if (idc(fa) == idc(p))
      rotate(fa), rotate(p);
    else
      rotate(p), rotate(p);
  }
}
void access(int x) {
  for (int y = 0; x; y = x, x = t[x].fa) {
    splay(x);
    t[x].ch[1] = 0;
    pushup(x);
    update(col[x], -t[x].sz);
    update(cnt, t[x].sz);
    t[x].ch[1] = y;
    pushup(x);
  }
}
void makeroot(int x) {
  cnt++;
  access(x);
  splay(x);
  reverse(x);
  col[x] = cnt;
}
int query(int x) {
  splay(x);
  return ask(col[x]) - t[t[x].ch[0]].sz;
}
void dfs(int u, int fa) {
  col[u] = u;
  t[u].sz = 1;
  for (auto v : G[u]) {
    if (v == fa) continue;
    t[v].fa = u;
    dfs(v, u);
    if (col[v] > col[u]) col[u] = col[v], t[u].ch[1] = v, pushup(u);
  }
  update(col[u], 1);
}
int main() {
  scanf("%d%d", &n, &Q);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(n, 0);
  cnt = n;
  for (int i = 1; i <= Q; i++) {
    scanf("%s", opt + 1);
    if (opt[1] == 'u') {
      int u;
      scanf("%d", &u);
      makeroot(u);
    } else if (opt[1] == 'w') {
      int u;
      scanf("%d", &u);
      printf("%d\n", query(u));
    } else {
      int u, v;
      scanf("%d%d", &u, &v);
      printf("%d\n", query(u) < query(v) ? u : v);
    }
  }
  return 0;
}
