#include <bits/stdc++.h>
using namespace std;
struct Splay {
  int ch[2], fa, size, col;
  bool rev, tag;
} t[200010];
int sta[200010];
int n, q, tot, fa[200010];
int cnt, head[200010], to[200010 << 1], nxt[200010 << 1];
int c[200010 << 1];
bool vis[200010];
void add(int x, int y) {
  for (; x <= n + q; x += (x & -x)) c[x] += y;
}
int ask(int x) {
  int ans = 0;
  for (; x; x -= (x & -x)) ans += c[x];
  return ans;
}
bool notroot(int u) { return t[t[u].fa].ch[0] == u || t[t[u].fa].ch[1] == u; }
bool get(int u) { return t[t[u].fa].ch[1] == u; }
void downrev(int u) {
  swap(t[u].ch[0], t[u].ch[1]);
  t[u].rev ^= 1;
}
void downcol(int u, int c) {
  t[u].col = c;
  t[u].tag = 1;
}
void down(int u) {
  if (t[u].rev) {
    downrev(t[u].ch[0]), downrev(t[u].ch[1]);
    t[u].rev = 0;
  }
  if (t[u].tag) {
    downcol(t[u].ch[0], t[u].col), downcol(t[u].ch[1], t[u].col);
    t[u].tag = 0;
  }
}
void up(int u) { t[u].size = t[t[u].ch[0]].size + t[t[u].ch[1]].size + 1; }
void rotate(int u) {
  int fa = t[u].fa, gfa = t[fa].fa;
  bool d1 = get(u), d2 = get(fa);
  t[u].fa = gfa;
  if (notroot(fa)) t[gfa].ch[d2] = u;
  int son = t[u].ch[d1 ^ 1];
  t[u].ch[d1 ^ 1] = fa;
  t[fa].fa = u;
  t[fa].ch[d1] = son;
  t[son].fa = fa;
  up(fa);
}
void splay(int u) {
  int now = u, top = 0;
  sta[++top] = now;
  while (notroot(now)) sta[++top] = now = t[now].fa;
  while (top) down(sta[top--]);
  while (notroot(u)) {
    int fa = t[u].fa;
    if (notroot(fa)) {
      if (get(u) == get(fa))
        rotate(fa);
      else
        rotate(u);
    }
    rotate(u);
  }
  up(u);
}
void access(int u) {
  int lastsize = 0;
  for (int v = 0; u; v = u, u = t[u].fa) {
    splay(u);
    t[u].ch[1] = v;
    up(u);
    add(t[u].col, -(t[u].size - lastsize));
    lastsize = t[u].size;
  }
}
void adde(int u, int v) {
  to[++cnt] = v;
  nxt[cnt] = head[u];
  head[u] = cnt;
}
void dfs(int u) {
  for (int i = head[u]; i; i = nxt[i]) {
    int v = to[i];
    if (v == fa[u]) continue;
    fa[v] = u;
    dfs(v);
  }
}
int query(int u) {
  splay(u);
  return ask(t[u].col - 1) + t[t[u].ch[1]].size + 1;
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) t[i].size = 1;
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    adde(u, v), adde(v, u);
  }
  dfs(n);
  for (int i = n - 1; i >= 1; i--) {
    int u = i;
    if (!vis[u]) {
      int sum = 0, top = 0;
      sum++;
      vis[u] = 1;
      t[u].col = i;
      sta[++top] = u;
      while (fa[u] && !vis[fa[u]]) {
        sum++;
        vis[fa[u]] = 1;
        t[fa[u]].col = i;
        sta[++top] = u = fa[u];
      }
      while (top > 1) {
        t[sta[top]].fa = sta[top - 1];
        t[sta[top - 1]].ch[0] = sta[top];
        up(sta[top - 1]);
        top--;
      }
      splay(u);
      if (fa[u]) t[u].fa = fa[u];
      add(i, sum);
    }
  }
  tot = n;
  int qq = q;
  while (qq--) {
    char opt[7];
    scanf("%s", opt);
    if (opt[0] == 'u') {
      tot++;
      int u;
      scanf("%d", &u);
      access(u);
      splay(u);
      downrev(u);
      downcol(u, tot);
      add(tot, t[u].size);
    }
    if (opt[0] == 'w') {
      int u;
      scanf("%d", &u);
      printf("%d\n", query(u));
    }
    if (opt[0] == 'c') {
      int u, v;
      scanf("%d%d", &u, &v);
      if (query(u) < query(v))
        printf("%d\n", u);
      else
        printf("%d\n", v);
    }
  }
  return 0;
}
