#include <bits/stdc++.h>
using namespace std;
namespace bit {
int tree[434543];
void upd(int x, int y) {
  if (x)
    for (; x < 434543; x += x & -x) tree[x] += y;
}
int ask(int x) {
  int y = 0;
  for (; x; x -= x & -x) y += tree[x];
  return y;
}
};  // namespace bit
int n, m;
int dist(int x, int y);
namespace lct {
int ch[434543][2];
int col[434543];
int tag[434543];
int rev[434543];
int siz[434543];
int pa[434543];
int nroot(int x) { return ch[pa[x]][0] == x or ch[pa[x]][1] == x; }
void up(int x) { siz[x] = siz[ch[x][0]] + siz[ch[x][1]] + (x > 0); }
void flip(int x) {
  swap(ch[x][0], ch[x][1]);
  rev[x] ^= 1;
}
void down(int x) {
  if (!x) return;
  if (rev[x]) flip(ch[x][0]), flip(ch[x][1]);
  if (tag[x])
    tag[ch[x][0]] = tag[ch[x][1]] = col[ch[x][0]] = col[ch[x][1]] = tag[x];
  tag[x] = rev[x] = 0;
}
void rotate(int x) {
  int y = pa[x], z = pa[y];
  if (nroot(y)) ch[z][ch[z][1] == y] = x;
  int d = ch[y][1] == x;
  int w = ch[x][d ^ 1];
  ch[y][d] = w;
  if (w) pa[w] = y;
  pa[x] = z, pa[y] = x;
  ch[x][d ^ 1] = y;
  up(y);
  up(x);
}
void splay(int x) {
  vector<int> dj;
  int xx = x;
  while (nroot(x)) dj.push_back(x), x = pa[x];
  dj.push_back(x);
  x = xx;
  for (int i = dj.size() - 1; ~i; i--) down(dj[i]);
  while (nroot(x)) {
    int y = pa[x], z = pa[y];
    if (nroot(y)) {
      if ((ch[y][1] == x) ^ (ch[z][1] == y))
        rotate(x);
      else
        rotate(y);
    }
    rotate(x);
  }
}
void access(int x, int cc) {
  for (int y = 0; x; y = x, x = pa[x]) {
    splay(x);
    ch[x][1] = 0;
    up(x);
    bit::upd(col[x], -siz[x]);
    col[x] = tag[x] = cc;
    bit::upd(col[x], siz[x]);
    ch[x][1] = y;
    up(x);
  }
}
void out(int x) {
  if (!x) return;
  down(x);
  out(ch[x][0]);
  cout << x << " ";
  out(ch[x][1]);
}
void makeroot(int x, int cc) {
  access(x, cc);
  splay(x);
  flip(x);
}
int query(int x) {
  splay(x);
  int cc = col[x];
  return bit::ask(cc) - siz[ch[x][0]];
}
void link(int x, int y) { pa[x] = y; }
};  // namespace lct
vector<int> v[434543];
void dfs(int x, int p) {
  for (int i = 0; i < v[x].size(); i++) {
    if (v[x][i] != p) dfs(v[x][i], x), lct::link(v[x][i], x);
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[x].push_back(y), v[y].push_back(x);
  }
  dfs(1, 0);
  int tot = 1;
  lct::col[1] = 1;
  for (int i = 2; i <= n; i++) lct::makeroot(i, ++tot);
  memset(bit::tree, 0, sizeof bit::tree);
  for (int i = 1; i <= n; i++) lct::splay(i), bit::upd(lct::col[i], 1);
  char ctrl[213];
  while (m--) {
    scanf("%s", ctrl);
    if (ctrl[0] == 'u') {
      int x;
      scanf("%d", &x);
      lct::makeroot(x, ++tot);
    } else if (ctrl[0] == 'w') {
      int x;
      scanf("%d", &x);
      printf("%d\n", lct::query(x));
    } else if (ctrl[0] == 'c') {
      int x, y;
      scanf("%d%d", &x, &y);
      if (lct::query(x) < lct::query(y))
        printf("%d\n", x);
      else
        printf("%d\n", y);
    } else
      puts("Where is the trust among people these days?");
  }
  return 0;
}
