#include <bits/stdc++.h>
using namespace std;
int n, q;
int tr[400005];
inline void Upd(int now, int val) {
  for (; now < 400005; now += now & -now) tr[now] += val;
}
inline int qsum(int now, int ret = 0) {
  for (; now; now -= now & -now) ret += tr[now];
  return ret;
}
namespace LCT {
int fa[400005] = {}, ch[400005][2] = {}, siz[400005] = {}, rev[400005] = {},
    col[400005] = {}, tag[400005] = {};
inline int inr(int x) { return ch[fa[x]][1] == x; }
inline int isr(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
inline void dt(int x) {
  if (rev[x]) {
    swap(ch[x][0], ch[x][1]), rev[x] = 0;
    if (ch[x][0]) rev[ch[x][0]] ^= 1;
    if (ch[x][1]) rev[ch[x][1]] ^= 1;
  }
  if (tag[x] && x) {
    col[x] = tag[ch[x][0]] = tag[ch[x][1]] = tag[x];
    tag[x] = 0;
  }
}
inline void upd(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1; }
inline void dtpath(int x) {
  if (!isr(x)) {
    dtpath(fa[x]);
  }
  dt(x);
}
inline void rot(int x) {
  int y = fa[x], z = fa[y], c = inr(x);
  (!isr(y)) && (ch[z][inr(y)] = x);
  (ch[y][c] = ch[x][!c]) && (fa[ch[y][c]] = y);
  fa[fa[ch[x][!c] = y] = x] = z;
  upd(y);
}
inline void splay(int x) {
  for (dtpath(x); !isr(x); rot(x))
    if (!isr(fa[x])) rot(inr(fa[x]) ^ inr(x) ? fa[x] : x);
  upd(x);
}
inline int access(int x, int newcol = 0, int y = 0) {
  for (; x; upd(x), x = fa[y = x]) {
    splay(x);
    siz[x] -= siz[ch[x][1]];
    if (newcol) Upd(col[x], -siz[x]), Upd(tag[x] = newcol, siz[x]);
    siz[x] += siz[ch[x][1] = y];
  }
  return y;
}
}  // namespace LCT
int info[400005], Prev[400005], to[400005], cnt_e;
void Node(int u, int v) {
  Prev[++cnt_e] = info[u], info[u] = cnt_e, to[cnt_e] = v;
}
void dfs(int now, int ff) {
  LCT::col[now] = now, LCT::fa[now] = ff, LCT::siz[now] = 1;
  for (int i = info[now]; i; i = Prev[i])
    if (to[i] != ff) dfs(to[i], now);
  Upd(now, 1);
}
int ask(int u) {
  LCT::splay(u);
  return qsum(LCT::col[u]) - LCT::siz[LCT::ch[u][0]];
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d%d", &u, &v);
    Node(u, v), Node(v, u);
  }
  dfs(1, 0);
  char s[10];
  for (int i = 1; i <= n; i++)
    LCT::access(i, i), LCT::splay(i), LCT::rev[i] ^= 1;
  for (; q--;) {
    scanf("%s", s);
    if (s[0] == 'u') {
      int u;
      scanf("%d", &u);
      LCT::access(u, ++n), LCT::splay(u), LCT::rev[u] ^= 1;
    }
    if (s[0] == 'w') {
      int u;
      scanf("%d", &u);
      printf("%d\n", ask(u));
    }
    if (s[0] == 'c') {
      int u, v;
      scanf("%d%d", &u, &v);
      printf("%d\n", ask(u) < ask(v) ? u : v);
    }
  }
}
