#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
const int inf = 1 << 30;
int n, qn, tot = 0, head[N], col[N], nowHead[N], deg[N], seq[N];
int dfsc = 0, id[N], siz[N], fa[N], son[N], dep[N], top[N];
bool vis[N];
struct Edge {
  int to, nxt;
} e[N << 1];
inline void add(int from, int to) {
  e[++tot].to = to;
  e[tot].nxt = head[from];
  head[from] = tot;
}
struct Seg {
  int l, r, c;
  inline Seg(int L = 0, int R = 0, int C = 0) { l = L, r = R, c = C; }
  friend bool operator<(const Seg x, const Seg y) { return x.l < y.l; }
};
set<Seg> seg[N];
template <typename T>
inline void read(T &X) {
  X = 0;
  char ch = 0;
  T op = 1;
  for (; ch > '9' || ch < '0'; ch = getchar())
    if (ch == '-') op = -1;
  for (; ch >= '0' && ch <= '9'; ch = getchar())
    X = (X << 3) + (X << 1) + ch - 48;
  X *= op;
}
namespace Bit {
int s[N << 1];
inline void modify(int p, int v) {
  if (!p) return;
  for (; p < (N << 1); p += (p & (-p))) s[p] += v;
}
inline int query(int p) {
  int res = 0;
  for (; p > 0; p -= (p & (-p))) res += s[p];
  return res;
}
}  // namespace Bit
void dfs1(int x, int fat, int depth) {
  fa[x] = fat, dep[x] = depth, siz[x] = 1;
  int maxson = -1;
  for (int i = head[x]; i; i = e[i].nxt) {
    int y = e[i].to;
    if (y == fat) continue;
    dfs1(y, x, depth + 1);
    siz[x] += siz[y];
    if (siz[y] > maxson) {
      maxson = siz[y];
      son[x] = y;
    }
  }
}
void dfs2(int x, int topf) {
  top[x] = topf, id[x] = ++dfsc;
  if (!son[x]) return;
  dfs2(son[x], topf);
  for (int i = head[x]; i; i = e[i].nxt) {
    int y = e[i].to;
    if (y == fa[x] || y == son[x]) continue;
    dfs2(y, y);
  }
}
inline int getLca(int x, int y) {
  for (; top[x] != top[y];) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    x = fa[top[x]];
  }
  return dep[x] < dep[y] ? x : y;
}
inline int getDis(int x, int y) {
  return dep[x] + dep[y] - 2 * dep[getLca(x, y)];
}
inline set<Seg>::iterator getSeg(set<Seg> &s, int l) {
  set<Seg>::iterator it = s.lower_bound(Seg(l, inf, 0));
  if (it != s.end() && it->l == l) return it;
  --it;
  int nowl = it->l, nowr = it->r, nowc = it->c;
  s.erase(it);
  if (l - 1 >= nowl) s.insert(Seg(nowl, l - 1, nowc));
  s.insert(Seg(l, nowr, nowc));
  return s.lower_bound(Seg(l, nowr, nowc));
}
inline void ins(set<Seg> &s, int l, int r, int c, int st) {
  set<Seg>::iterator itl = getSeg(s, l), itr;
  if (r + 1 <= id[st] + siz[st] - 1)
    itr = getSeg(s, r + 1);
  else
    itr = s.end();
  for (set<Seg>::iterator it = itl; it != itr; ++it) {
    Bit ::modify(it->c, -((it->r) - (it->l) + 1));
  }
  Bit ::modify(c, r - l + 1);
  s.erase(itl, itr), s.insert(Seg(l, r, c));
}
inline void modify(int x, int y, int c) {
  nowHead[c] = y;
  for (; top[x] != top[y];) {
    if (dep[top[x]] < dep[top[y]]) swap(x, y);
    ins(seg[top[x]], id[top[x]], id[x], c, top[x]);
    x = fa[top[x]];
  }
  if (dep[x] > dep[y]) swap(x, y);
  ins(seg[top[x]], id[x], id[y], c, top[x]);
}
inline int solve(int x) {
  int c = getSeg(seg[top[x]], id[x])->c;
  return Bit ::query(c - 1) + getDis(x, nowHead[c]) + 1;
}
int main() {
  read(n), read(qn);
  for (int x, y, i = 1; i < n; i++) {
    read(x), read(y);
    ++deg[x], ++deg[y];
    add(x, y), add(y, x);
  }
  dfs1(1, 0, 1), dfs2(1, 1);
  int cnt = 0;
  set<int> q;
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) q.insert(i), vis[i] = 1;
  for (; !q.empty();) {
    int now = (*q.begin());
    q.erase(*q.begin());
    seq[now] = ++cnt;
    nowHead[cnt] = now;
    seg[top[now]].insert(Seg(id[now], id[now], cnt));
    Bit ::modify(cnt, 1);
    for (int i = head[now]; i; i = e[i].nxt) {
      if (vis[e[i].to]) continue;
      --deg[e[i].to];
      if (deg[e[i].to] == 1 && !vis[e[i].to])
        q.insert(e[i].to), vis[e[i].to] = 1;
    }
  }
  int lst = n;
  for (char op[9]; qn--;) {
    scanf("%s", op);
    if (op[0] == 'u') {
      int x;
      read(x);
      modify(x, lst, ++cnt);
      lst = x;
    }
    if (op[0] == 'w') {
      int x;
      read(x);
      printf("%d\n", solve(x));
    }
    if (op[0] == 'c') {
      int x, y;
      read(x), read(y);
      printf("%d\n", solve(x) < solve(y) ? x : y);
    }
  }
  return 0;
}
