#include <bits/stdc++.h>
using namespace std;
int read() {
  char ch = getchar();
  int x = 0, op = 1;
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') op = -1;
  for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
  return x * op;
}
const int N = 4e5 + 100;
int n, m, x, y, cnt, head[N], mx[N], fa[N], c[N][2], sz[N], rev[N], cov[N];
char op[10];
struct edge {
  int to, nxt;
} e[N];
void adde(int x, int y) {
  e[++cnt].to = y;
  e[cnt].nxt = head[x];
  head[x] = cnt;
}
int bit[N];
void add(int x, int v) {
  for (; x < N; x += x & -x) bit[x] += v;
}
int qry(int x) {
  int s = 0;
  for (; x; x -= x & -x) s += bit[x];
  return s;
}
void up(int x);
void dfs(int u, int par) {
  mx[u] = u;
  int p = 0;
  for (int i = head[u], v; i; i = e[i].nxt)
    if (v = e[i].to, v != par) {
      fa[v] = u, dfs(v, u);
      if (mx[v] > mx[u]) mx[u] = mx[v], p = v;
    }
  if (p) c[u][1] = p;
  add(mx[u], 1), up(u);
}
inline bool isrt(int x) { return c[fa[x]][0] != x && c[fa[x]][1] != x; }
void up(int x) {
  if (!x) return;
  sz[x] = sz[c[x][0]] + sz[c[x][1]] + 1;
}
void ps_rev(int x) {
  if (!x) return;
  rev[x] ^= 1;
}
void ps_cov(int x, int y) {
  if (!x) return;
  cov[x] = mx[x] = y;
}
void down(int x) {
  if (!x) return;
  if (rev[x])
    swap(c[x][0], c[x][1]), ps_rev(c[x][0]), ps_rev(c[x][1]), rev[x] = 0;
  if (cov[x]) ps_cov(c[x][0], cov[x]), ps_cov(c[x][1], cov[x]), cov[x] = 0;
}
void rot(int x) {
  int y = fa[x], z = fa[y], f = c[y][1] == x;
  c[y][f] = c[x][f ^ 1];
  if (c[x][f ^ 1]) fa[c[x][f ^ 1]] = y;
  fa[x] = z;
  if (!isrt(y)) c[z][c[z][1] == y] = x;
  fa[y] = x;
  c[x][f ^ 1] = y;
  up(y);
  up(x);
}
int q[N];
void splay(int x) {
  int tp = 1;
  q[1] = x;
  for (int i = x; !isrt(i); i = fa[i]) q[++tp] = fa[i];
  while (tp) down(q[tp--]);
  for (int y; !isrt(x); rot(x))
    if (!isrt(y = fa[x])) rot((c[fa[y]][0] == y) == (c[y][0] == x) ? y : x);
}
void access(int x) {
  for (int y = 0; x; y = x, x = fa[x]) {
    splay(x);
    add(mx[x], -sz[c[x][0]] - 1);
    c[x][1] = y, up(x);
  }
}
void mkrt(int x) {
  access(x), splay(x);
  ps_rev(x), ps_cov(c[x][0], n);
  add(n, sz[c[x][0]]);
  mx[x] = ++n;
  add(n, 1);
  down(x);
  c[x][1] = 0;
  up(x);
}
int rk(int x) {
  splay(x);
  return qry(mx[x]) - sz[c[x][0]];
}
int main() {
  n = read(), m = read();
  for (int i = (1); i <= (n - 1); i++)
    x = read(), y = read(), adde(x, y), adde(y, x);
  dfs(n, 0);
  while (m--) {
    scanf("%s", op);
    int x = read(), y;
    if (op[0] == 'u')
      mkrt(x);
    else if (op[0] == 'w')
      printf("%d\n", rk(x));
    else
      y = read(), printf("%d\n", rk(x) < rk(y) ? x : y);
  }
  return 0;
}
