#include <bits/stdc++.h>
using namespace std;
void read(int &x) {
  x = 0;
  int f = 1;
  char ch = getchar();
  for (; !isdigit(ch); ch = getchar())
    if (ch == '-') f = -f;
  for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
  x *= f;
}
void print(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (!x) return;
  print(x / 10), putchar(x % 10 + 48);
}
void write(int x) {
  if (!x)
    putchar('0');
  else
    print(x);
  putchar('\n');
}
const int maxn = 1e6 + 10;
const int inf = 1e9;
const double eps = 1e-8;
const int mod = 1e9 + 7;
int fa[maxn], son[maxn][2], sz[maxn], rev[maxn], sta[maxn], top, n, m,
    col[maxn], cov[maxn];
void update(int x) { sz[x] = sz[son[x][0]] + sz[son[x][1]] + 1; }
int which(int x) { return son[fa[x]][1] == x; }
int nrt(int x) { return son[fa[x]][0] == x || son[fa[x]][1] == x; }
void push_cov(int x, int v) { col[x] = cov[x] = v; }
void push_rev(int x) {
  swap(son[x][0], son[x][1]);
  rev[x] ^= 1;
}
void pushdown(int x) {
  if (cov[x])
    push_cov(son[x][0], cov[x]), push_cov(son[x][1], cov[x]), cov[x] = 0;
  if (rev[x]) rev[x] = 0, push_rev(son[x][0]), push_rev(son[x][1]);
}
void rotate(int x) {
  int y = fa[x], z = fa[y], w = which(x);
  if (nrt(y)) son[z][son[z][1] == y] = x;
  fa[x] = z, fa[y] = x, fa[son[x][w ^ 1]] = y, son[y][w] = son[x][w ^ 1],
  son[x][w ^ 1] = y;
  update(y), update(x);
}
void splay(int x) {
  int t = x;
  while (nrt(t)) sta[++top] = t, t = fa[t];
  sta[++top] = t;
  while (top) pushdown(sta[top--]);
  while (nrt(x)) {
    int y = fa[x], z = fa[y];
    if (nrt(y)) rotate(((son[z][1] == y) ^ (son[y][1] == x)) ? x : y);
    rotate(x);
  }
  update(x);
}
struct BIT {
  int t[maxn];
  void modify(int x, int v) {
    if (!x) return;
    for (; x <= n + m; x += x & -x) t[x] += v;
  }
  int query(int x, int ans = 0) {
    for (; x; x -= x & -x) ans += t[x];
    return ans;
  }
} T;
void access(int x, int c) {
  for (int t = 0; x; t = x, x = fa[x]) {
    splay(x);
    T.modify(col[x], -sz[son[x][0]] - 1);
    son[x][1] = t;
    push_cov(son[x][0], c);
    pushdown(son[x][0]);
    col[x] = c;
    T.modify(c, sz[son[x][0]] + 1);
    update(x);
  }
}
void link(int x, int y) {
  access(x, 0);
  splay(x);
  push_rev(x);
  fa[x] = y;
}
int query(int x) {
  splay(x);
  int res = T.query(col[x] - 1);
  splay(x);
  res += sz[son[x][1]] + 1;
  return res;
}
char s[20];
int cnt;
void up(int x) {
  access(x, cnt), splay(x), push_rev(x), pushdown(x);
  T.modify(cnt, -1);
  push_cov(x, ++cnt), sz[x] = 1, son[x][1] = 0;
  T.modify(cnt, 1);
}
int main() {
  read(n), read(m);
  for (int i = 1, x, y; i < n; i++) read(x), read(y), link(x, y);
  for (int i = 1; i <= n; i++) up(i);
  for (int i = 1; i <= m; i++) {
    scanf("%s", s + 1);
    int x, y;
    read(x);
    if (s[1] == 'u')
      up(x);
    else if (s[1] == 'w')
      write(query(x));
    else
      read(y), write(query(x) < query(y) ? x : y);
  }
  return 0;
}
