#include <bits/stdc++.h>
using namespace std;
const int N = 200002;
const int M = N << 1;
int n, q;
int cnt, head[N], Next[M], vv[M];
int c[M];
int tot;
void ADD(int x, int v) {
  for (; x <= n + q; x += x & (-x)) c[x] += v;
}
int QRY(int x) {
  int ans = 0;
  for (; x; x ^= x & (-x)) ans += c[x];
  return ans;
}
namespace LCT {
struct node {
  int v, sz, tag;
  node *ch[2], *fa;
  void maintain() {
    sz = 1;
    if (ch[0] != NULL) sz += ch[0]->sz;
    if (ch[1] != NULL) sz += ch[1]->sz;
  }
  void push() {
    if (tag) {
      if (ch[0] != NULL) ch[0]->tag ^= 1, swap(ch[0]->ch[0], ch[0]->ch[1]);
      if (ch[1] != NULL) ch[1]->tag ^= 1, swap(ch[1]->ch[0], ch[1]->ch[1]);
      tag = 0;
    }
    if (ch[0] != NULL) ch[0]->v = v;
    if (ch[1] != NULL) ch[1]->v = v;
  }
} t[N];
inline int sss(node *o) { return o == NULL ? 0 : o->sz; }
inline int Which(node *o) {
  if (o->fa == NULL) return -1;
  if (o->fa->ch[0] == o) return 0;
  if (o->fa->ch[1] == o) return 1;
  return -1;
}
void rotate(node *k) {
  node *ovo = k->fa, *&o = Which(ovo) == -1 ? ovo : ovo->fa->ch[Which(ovo)];
  int d = Which(k);
  if (k->ch[d ^ 1] != NULL) k->ch[d ^ 1]->fa = o;
  k->fa = o->fa;
  o->fa = k;
  o->ch[d] = k->ch[d ^ 1];
  k->ch[d ^ 1] = o;
  o->maintain();
  k->maintain();
  o = k;
}
int L;
node *st[N];
void splay(node *k) {
  node *kk = k;
  L = 0;
  while (Which(kk) != -1) st[++L] = kk->fa, kk = kk->fa;
  while (L) st[L--]->push();
  k->push();
  while (Which(k) != -1) {
    node *o = k->fa;
    if (Which(o) == -1) {
      rotate(k);
      break;
    }
    if (Which(o) == Which(k))
      rotate(o);
    else
      rotate(k);
    rotate(k);
  }
}
void access(node *v) {
  splay(v);
  v->ch[1] = NULL;
  v->maintain();
  ADD(v->v, -v->sz);
  while (v->fa != NULL) {
    node *o = v->fa;
    splay(o);
    o->ch[1] = NULL;
    o->maintain();
    ADD(o->v, -o->sz);
    o->ch[1] = v;
    v = o;
    v->maintain();
  }
}
void makert(int x) {
  node *v = &t[x];
  tot++;
  access(v);
  splay(v);
  v->tag ^= 1;
  swap(v->ch[0], v->ch[1]);
  v->v = tot;
  v->push();
  ADD(tot, v->sz);
}
int when(int x) {
  splay(&t[x]);
  return QRY(t[x].v) - sss(t[x].ch[0]);
}
}  // namespace LCT
using namespace LCT;
void read(int &x) {
  char ch = getchar();
  x = 0;
  for (; ch < '0' || ch > '9'; ch = getchar())
    ;
  for (; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
}
void add(int x, int y) {
  Next[++cnt] = head[x];
  head[x] = cnt;
  vv[cnt] = y;
}
void dfs(int x, int fa) {
  if (fa) t[x].fa = &t[fa];
  t[x].v = x;
  t[x].sz = 1;
  for (int i = head[x]; i; i = Next[i])
    if (vv[i] != fa) {
      int tmp = vv[i];
      dfs(tmp, x);
      if (t[tmp].v > t[x].v) {
        t[x].v = t[tmp].v;
        t[x].ch[1] = &t[tmp];
        t[x].sz = t[tmp].sz + 1;
      }
    }
  ADD(t[x].v, 1);
}
int main() {
  read(n);
  read(q);
  int x, y;
  for (int i = 2; i <= n; i++) {
    read(x);
    read(y);
    add(x, y);
    add(y, x);
  }
  dfs(n, 0);
  tot = n;
  for (int o = 1; o <= q; o++) {
    char ch[10];
    scanf("%s", ch + 1);
    read(x);
    if (ch[1] == 'u')
      makert(x);
    else if (ch[1] == 'w')
      printf("%d\n", when(x));
    else {
      read(y);
      printf("%d\n", when(x) < when(y) ? x : y);
    }
  }
  return 0;
}
