#include <bits/stdc++.h>
using namespace std;
int f[200010];
int s[200010][2];
int size[200010];
int st[200010];
int v[400010];
int tot;
int head[200010];
int nex[400010];
int to[400010];
char ch[10];
int n, m;
int x, y;
int cnt;
int rev[200010];
int val[200010];
void add_edge(int x, int y) {
  nex[++tot] = head[x];
  head[x] = tot;
  to[tot] = y;
}
void add(int x, int k) {
  for (int i = x; i <= n + m; i += i & -i) {
    v[i] += k;
  }
}
int ask(int x) {
  int res = 0;
  for (int i = x; i; i -= i & -i) {
    res += v[i];
  }
  return res;
}
void dfs(int x) {
  val[x] = x;
  size[x] = 1;
  for (int i = head[x]; i; i = nex[i]) {
    if (to[i] != f[x]) {
      f[to[i]] = x;
      dfs(to[i]);
      if (val[to[i]] > val[x]) {
        val[x] = val[to[i]];
        s[x][1] = to[i];
        size[x] = size[to[i]] + 1;
      }
    }
  }
  add(val[x], 1);
}
bool is_root(int rt) { return rt != s[f[rt]][0] && rt != s[f[rt]][1]; }
bool get(int rt) { return rt == s[f[rt]][1]; }
void pushup(int rt) { size[rt] = size[s[rt][0]] + size[s[rt][1]] + 1; }
void pushdown(int rt) {
  if (rev[rt]) {
    swap(s[rt][0], s[rt][1]);
    rev[s[rt][0]] ^= 1;
    rev[s[rt][1]] ^= 1;
    rev[rt] = 0;
  }
  if (s[rt][0]) val[s[rt][0]] = val[rt];
  if (s[rt][1]) val[s[rt][1]] = val[rt];
}
void rotate(int rt) {
  int fa = f[rt];
  int anc = f[fa];
  int k = get(rt);
  if (!is_root(fa)) {
    s[anc][get(fa)] = rt;
  }
  s[fa][k] = s[rt][k ^ 1];
  f[s[rt][k ^ 1]] = fa;
  s[rt][k ^ 1] = fa;
  f[fa] = rt;
  f[rt] = anc;
  pushup(fa);
  pushup(rt);
}
void splay(int rt) {
  int top = 0;
  st[++top] = rt;
  for (int i = rt; !is_root(i); i = f[i]) {
    st[++top] = f[i];
  }
  for (int i = top; i >= 1; i--) {
    pushdown(st[i]);
  }
  for (int fa; !is_root(rt); rotate(rt)) {
    if (!is_root(fa = f[rt])) {
      rotate(get(fa) == get(rt) ? fa : rt);
    }
  }
}
void access(int rt) {
  for (int x = 0; rt; x = rt, rt = f[rt]) {
    splay(rt);
    s[rt][1] = 0;
    pushup(rt);
    add(val[rt], -size[rt]);
    add(cnt, size[rt]);
    s[rt][1] = x;
    pushup(rt);
  }
}
void reverse(int rt) {
  cnt++;
  access(rt);
  splay(rt);
  rev[rt] ^= 1;
  val[rt] = cnt;
}
int query(int rt) {
  splay(rt);
  return ask(val[rt]) - size[s[rt][0]];
}
int main() {
  scanf("%d%d", &n, &m);
  cnt = n;
  for (int i = 1; i < n; i++) {
    scanf("%d%d", &x, &y);
    add_edge(x, y);
    add_edge(y, x);
  }
  dfs(n);
  for (int i = 1; i <= m; i++) {
    scanf("%s", ch);
    if (ch[0] == 'u') {
      scanf("%d", &x);
      reverse(x);
    } else if (ch[0] == 'w') {
      scanf("%d", &x);
      printf("%d\n", query(x));
    } else {
      scanf("%d%d", &x, &y);
      printf("%d\n", query(x) < query(y) ? x : y);
    }
  }
}
