#include <bits/stdc++.h>
using namespace std;
int n, q, tot, la[200020], cnt;
struct edge {
  int v, ne;
} e[200020 << 1];
inline void add(int u, int v) {
  e[tot].v = v, e[tot].ne = la[u], la[u] = tot++;
}
struct BIT {
  int tr[200020 + 200020];
  inline int lowbit(int x) { return x & (-x); }
  inline void add(int x, int v) {
    for (int i = x; i < 200020 + 200020; i += lowbit(i)) tr[i] += v;
  }
  inline int sum(int x) {
    int ans = 0;
    for (int i = x; i; i -= lowbit(i)) ans += tr[i];
    return ans;
  }
} t;
struct LCT {
  int ch[200020][2], f[200020], sz[200020], col[200020], st[200020];
  bool rev[200020];
  inline void pushup(int o) { sz[o] = sz[ch[o][0]] + sz[ch[o][1]] + 1; }
  inline void pushdown(int o) {
    int ls = ch[o][0], rs = ch[o][1];
    if (ls) col[ls] = col[o];
    if (rs) col[rs] = col[o];
    if (!rev[o]) return;
    swap(ch[o][0], ch[o][1]);
    if (ls) rev[ls] ^= 1;
    if (rs) rev[rs] ^= 1;
    rev[o] = 0;
  }
  inline bool isroot(int o) { return (ch[f[o]][0] != o) && (ch[f[o]][1] != o); }
  inline bool isrs(int o) { return ch[f[o]][1] == o; }
  inline void rotate(int x) {
    int y = f[x], z = f[y], d = isrs(x), w = ch[x][d ^ 1];
    f[x] = z;
    if (!isroot(y)) ch[z][isrs(y)] = x;
    f[y] = x;
    ch[x][d ^ 1] = y;
    f[w] = y;
    ch[y][d] = w;
    pushup(y), pushup(x);
  }
  inline void splay(int x) {
    int tp;
    st[tp = 1] = x;
    for (int o = x; !isroot(o); o = f[o]) st[++tp] = f[o];
    while (tp) pushdown(st[tp--]);
    while (!isroot(x)) {
      int y = f[x];
      if ((!isroot(y)) && isrs(y) == isrs(x))
        rotate(y), rotate(x);
      else
        rotate(x);
    }
  }
  inline void build(int u) {
    sz[u] = 1, col[u] = u;
    for (int i = la[u]; ~i; i = e[i].ne) {
      int v = e[i].v;
      if (v == f[u]) continue;
      f[v] = u, build(v);
      col[u] = max(col[u], col[v]);
    }
    for (int i = la[u]; ~i; i = e[i].ne) {
      int v = e[i].v;
      if (v == f[u]) continue;
      if (col[u] == col[v]) {
        ch[u][1] = v, pushup(u);
        break;
      }
    }
    t.add(col[u], 1);
  }
  inline void access(int o) {
    int lst = 0;
    while (o) {
      splay(o);
      ch[o][1] = 0;
      pushup(o);
      t.add(col[o], -sz[o]);
      t.add(col[o] = cnt, sz[o]);
      ch[o][1] = lst;
      pushup(o);
      lst = o;
      o = f[o];
    }
  }
  inline void makeroot(int o) {
    ++cnt;
    access(o);
    splay(o);
    rev[o] ^= 1;
  }
  inline int when(int o) {
    splay(o);
    return t.sum(col[o]) - sz[ch[o][0]];
  }
} lct;
void init() {
  tot = 0;
  memset(la, -1, sizeof(la));
  scanf("%d%d", &n, &q);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v), add(v, u);
  }
  lct.build(cnt = n);
}
void solve() {
  char opt[10];
  while (q--) {
    scanf("%s", opt);
    if (opt[0] == 'u') {
      int u;
      scanf("%d", &u);
      lct.makeroot(u);
    } else if (opt[0] == 'w') {
      int u;
      scanf("%d", &u);
      printf("%d\n", lct.when(u));
    } else {
      int u, v;
      scanf("%d%d", &u, &v);
      printf("%d\n", (lct.when(u) < lct.when(v)) ? u : v);
    }
  }
}
int main() {
  init();
  solve();
  return 0;
}
