#include <bits/stdc++.h>
using namespace std;
const int N = 200010, M = 1000010, P = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int INF = 0xcfcfcfcf;
const double eps = 1e-9, pi = asin(1) * 2;
inline long long read();
inline int ADD(int a, int b) { return a + b >= P ? a + b - P : a + b; }
inline int MINUS(int a, int b) { return a - b < 0 ? a - b + P : a - b; }
int head[N], ver[M], nxt[M];
int n, m, tot = 1, cnt;
inline void add(int x, int y) {
  ver[++tot] = y, nxt[tot] = head[x], head[x] = tot;
}
struct BIT {
  int c[N << 2];
  inline void update(int x, int v) {
    for (int i = x; i <= n + m; i += ((i) & -(i))) c[i] += v;
  }
  inline int query(int x) {
    int sum = 0;
    for (int i = x; i; i -= ((i) & -(i))) sum += c[i];
    return sum;
  }
} bit;
struct LCT {
  int ch[N][2], f[N], v[N], rev[N], size[N];
  inline void pushup(int p) { size[p] = size[ch[p][0]] + size[ch[p][1]] + 1; }
  inline void reverse(int p) { swap(ch[p][0], ch[p][1]), rev[p] ^= 1; }
  inline void pushdown(int p) {
    if (ch[p][0]) v[ch[p][0]] = v[p];
    if (ch[p][1]) v[ch[p][1]] = v[p];
    if (rev[p]) {
      if (ch[p][0]) reverse(ch[p][0]);
      if (ch[p][1]) reverse(ch[p][1]);
      rev[p] = 0;
    }
  }
  int sta[N], top = 0;
  inline void pre_push(int x) {
    sta[top = 1] = x;
    while (!isroot(x)) sta[++top] = x = f[x];
    while (top) pushdown(sta[top--]);
  }
  inline bool isroot(int x) { return ch[f[x]][0] != x && ch[f[x]][1] != x; }
  inline void rotate(int x) {
    int y = f[x], z = f[y], k = (ch[y][1] == x);
    if (!isroot(y)) ch[z][ch[z][1] == y] = x;
    ch[y][k] = ch[x][k ^ 1], ch[x][k ^ 1] = y;
    if (ch[y][k]) f[ch[y][k]] = y;
    f[x] = z, f[y] = x;
    pushup(y);
  }
  inline void splay(int x) {
    pre_push(x);
    while (!isroot(x)) {
      int y = f[x], z = f[y];
      if (!isroot(y)) rotate((ch[y][0] == x) == (ch[z][0] == y) ? y : x);
      rotate(x);
    }
    pushup(x);
  }
  inline void access(int x) {
    for (int y = 0; x; x = f[y = x]) {
      splay(x), ch[x][1] = 0, pushup(x);
      bit.update(v[x], -size[x]);
      bit.update(cnt, size[x]);
      ch[x][1] = y, pushup(x);
    }
  }
  inline void makeroot(int x) {
    cnt++, access(x), splay(x), reverse(x), v[x] = cnt;
  }
  inline int query(int x) {
    splay(x);
    return bit.query(v[x]) - size[ch[x][0]];
  }
  inline void dfs(int x, int fa) {
    size[x] = 1, v[x] = x, f[x] = fa;
    for (int i = head[x]; i; i = nxt[i]) {
      int y = ver[i];
      if (y == fa) continue;
      dfs(y, x);
      if (v[y] > v[x]) v[x] = v[y], size[x] = size[y] + 1, ch[x][1] = y;
    }
    bit.update(v[x], 1);
  }
  inline void write() {
    cerr << "ch: \n";
    for (int i = 1; i <= n; i++)
      cerr << i << " " << ch[i][0] << " " << ch[i][1] << "\n";
    cerr << "\n";
    cerr << "size: \n";
    for (int i = 1; i <= n; i++) cerr << size[i] << " ";
    cerr << "\n";
    cerr << "v: \n";
    for (int i = 1; i <= n; i++) cerr << v[i] << " ";
    cerr << "\n";
    cerr << "f: \n";
    for (int i = 1; i <= n; i++) cerr << f[i] << " ";
    cerr << "\n";
    cerr << "bit: \n";
    for (int i = 1; i <= cnt; i++) cerr << bit.query(i) << " ";
    cerr << "\n";
    cerr << "when: \n";
    for (int i = 1; i <= n; i++) cerr << query(i) << " ";
    cerr << "\n";
    cerr << "-----------------\n";
  }
} lct;
char opt[10];
inline long long read() {
  long long s = 0;
  bool flag = false;
  char ch = getchar();
  for (; ch < '0' || ch > '9'; ch = getchar())
    if (ch == '-') flag = true;
  for (; '0' <= ch && ch <= '9'; ch = getchar())
    s = (s << 3) + (s << 1) + (ch ^ '0');
  if (flag) return -s;
  return s;
}
int main() {
  cnt = n = read(), m = read();
  for (int i = 1; i < n; i++) {
    int x = read(), y = read();
    add(x, y), add(y, x);
  }
  lct.dfs(n, 0);
  for (int i = 1; i <= m; i++) {
    scanf("%s", opt + 1);
    if (opt[1] == 'u') {
      int x = read();
      lct.makeroot(x);
    }
    if (opt[1] == 'w') {
      int x = read();
      printf("%d\n", lct.query(x));
    }
    if (opt[1] == 'c') {
      int x = read(), y = read();
      printf("%d\n", lct.query(x) < lct.query(y) ? x : y);
    }
  }
  return 0;
}
