#include <bits/stdc++.h>
using namespace std;
const int maxn = 200010;
int n, Q, now;
int entry[maxn];
vector<int> ver[maxn];
namespace fenwicktree {
int tree[maxn << 1];
void add(int x, int k) {
  for (; x <= 400000; x += x & -x) tree[x] += k;
}
int qry(int x) {
  int res(0);
  for (; x; x -= x & -x) res += tree[x];
  return res;
}
}  // namespace fenwicktree
namespace LCT {
int ch[maxn][2], fa[maxn], col[maxn], ctag[maxn], sz[maxn], rtag[maxn];
bool isroot(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
void update(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1; }
void pushdown(int x) {
  if (ctag[x])
    col[ch[x][0]] = col[ch[x][1]] = ctag[ch[x][0]] = ctag[ch[x][1]] = ctag[x];
  if (rtag[x])
    swap(ch[x][0], ch[x][1]), rtag[ch[x][0]] ^= 1, rtag[ch[x][1]] ^= 1;
  ctag[x] = rtag[x] = 0;
}
void rotate(int x) {
  bool f = (ch[fa[x]][0] == x);
  int u = ch[x][f], y = fa[x], z = fa[y];
  if (!isroot(y)) ch[z][ch[z][1] == y] = x;
  fa[x] = z;
  ch[x][f] = y, fa[y] = x;
  if (u) fa[u] = y;
  ch[y][!f] = u;
  update(y), update(x);
}
void pushup(int x) {
  if (!isroot(x)) pushup(fa[x]);
  pushdown(x), update(x);
}
void splay(int x) {
  pushup(x);
  for (register int y = fa[x], z = fa[y]; !isroot(x); z = fa[y = fa[x]]) {
    if (isroot(y))
      rotate(x);
    else if ((ch[y][0] == x) ^ (ch[z][0] == y))
      rotate(x), rotate(x);
    else
      rotate(y), rotate(x);
  }
  update(x);
}
void access(int x) {
  for (register int y = 0; x; x = fa[y = x]) {
    splay(x);
    sz[0] = 0, fenwicktree::add(col[x], -sz[ch[x][0]] - 1);
    ch[x][1] = y;
    update(x);
  }
}
void makeroot(int x, int C) {
  access(x);
  splay(x);
  if (ch[x][0]) rtag[ch[x][0]] ^= 1;
  if (ch[x][1]) rtag[ch[x][1]] ^= 1;
  swap(ch[x][0], ch[x][1]);
  col[x] = ctag[x] = C;
  fenwicktree::add(C, sz[x]);
}
}  // namespace LCT
void dfs(int x) {
  for (register int i = 0; i < ver[x].size(); ++i)
    if (ver[x][i] != LCT::fa[x]) {
      LCT::fa[ver[x][i]] = x;
      dfs(ver[x][i]);
    }
}
void up(int x) { LCT::makeroot(x, ++now); }
int when(int x) {
  LCT::splay(x);
  return fenwicktree::qry(LCT::col[x]) - LCT::sz[LCT::ch[x][0]];
}
int cmp(int x, int y) {
  int a = when(x), b = when(y);
  return a < b ? x : y;
}
int main() {
  cin >> n >> Q;
  for (register int i = 1; i < n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    ver[x].push_back(y), ver[y].push_back(x);
    ++entry[x], ++entry[y];
  }
  priority_queue<int, vector<int>, greater<int> > q;
  for (register int i = 1; i <= n; ++i)
    if (entry[i] == 1) q.push(i), --entry[i];
  dfs(n);
  while (!q.empty()) {
    int x = q.top();
    q.pop();
    LCT::col[x] = ++now;
    fenwicktree::add(now, 1);
    if (--entry[LCT::fa[x]] == 1) q.push(LCT::fa[x]);
  }
  for (register int i = 1; i <= n; ++i) LCT::update(i);
  while (Q--) {
    char s[5];
    scanf("%s", s);
    if (s[0] == 'u') {
      int x;
      scanf("%d", &x);
      up(x);
    }
    if (s[0] == 'w') {
      int x;
      scanf("%d", &x);
      printf("%d\n", when(x));
    }
    if (s[0] == 'c') {
      int x, y;
      scanf("%d%d", &x, &y);
      printf("%d\n", cmp(x, y));
    }
  }
  return 0;
}
