#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x) {
  x = 0;
  char c = getchar();
  bool flag = false;
  while (!isdigit(c)) {
    if (c == '-') flag = true;
    c = getchar();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = getchar();
  }
  if (flag) x = -x;
}
int n, q;
int tr[1000010], ch[1000010][2], fa[1000010], rev[1000010], siz[1000010],
    col[1000010], tag[1000010];
char opt[10];
struct edge {
  int to, nxt;
  edge(int a = 0, int b = 0) { to = a, nxt = b; }
} e[1000010];
int head[1000010], edge_cnt;
void add(int from, int to) {
  e[++edge_cnt] = edge(to, head[from]), head[from] = edge_cnt;
}
void update(int x, int v) {
  while (x <= n + q) tr[x] += v, x += (x & (-x));
}
int ask(int x) {
  int v = 0;
  while (x) v += tr[x], x -= (x & (-x));
  return v;
}
bool check(int x) { return ch[fa[x]][1] == x; }
void pushup(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + 1; }
void pushrev(int x) { rev[x] ^= 1, swap(ch[x][0], ch[x][1]); }
void pushtag(int x, int v) { col[x] = tag[x] = v; }
void pushdown(int x) {
  if (rev[x]) pushrev(ch[x][0]), pushrev(ch[x][1]), rev[x] = 0;
  if (tag[x]) pushtag(ch[x][0], tag[x]), pushtag(ch[x][1], tag[x]), tag[x] = 0;
}
bool notroot(int x) { return ch[fa[x]][0] == x || ch[fa[x]][1] == x; }
void rotate(int x) {
  int y = fa[x], z = fa[y], k = check(x), w = ch[x][k ^ 1];
  if (notroot(y)) ch[z][check(y)] = x;
  ch[x][k ^ 1] = y, ch[y][k] = w;
  if (w) fa[w] = y;
  fa[x] = z, fa[y] = x;
  pushup(y), pushup(x);
}
void all(int x) {
  if (notroot(x)) all(fa[x]);
  pushdown(x);
}
void splay(int x) {
  all(x);
  for (int y; notroot(x); rotate(x))
    if (notroot(y = fa[x])) rotate(check(x) ^ check(y) ? x : y);
  pushup(x);
}
void access(int x, int v) {
  for (int y = 0; x; y = x, x = fa[x]) {
    splay(x), siz[x] -= siz[ch[x][1]], update(col[x], -siz[x]);
    pushtag(x, v), update(col[x], siz[x]), ch[x][1] = y, pushup(x);
  }
}
void makeroot(int x, int v) { access(x, v), splay(x), pushrev(x); }
int query(int x) {
  splay(x);
  return ask(col[x]) - siz[ch[x][0]];
}
void dfs(int x, int fath) {
  fa[x] = fath, update(col[x] = x, siz[x] = 1);
  for (int i = head[x]; i; i = e[i].nxt) {
    int y = e[i].to;
    if (y == fath) continue;
    dfs(y, x);
  }
}
int main() {
  read(n), read(q);
  for (int i = 1; i < n; ++i) {
    int x, y;
    read(x), read(y);
    add(x, y), add(y, x);
  }
  dfs(1, 0);
  for (int i = 1; i <= n; ++i) makeroot(i, i);
  for (int i = 1; i <= q; ++i) {
    int x, y;
    scanf("%s", opt), read(x);
    if (opt[0] == 'u') makeroot(x, ++n);
    if (opt[0] == 'w') printf("%d\n", query(x));
    if (opt[0] == 'c') read(y), printf("%d\n", query(x) < query(y) ? x : y);
  }
  return 0;
}
