#include <bits/stdc++.h>
using namespace std;
const int inf = 1e9;
const long long Inf = 1e18;
const int mod = 1;
template <typename T = int>
T gi() {
  T x = 0, o = 1;
  char ch = getchar();
  while ((ch < '0' || ch > '9') && ch != '-') ch = getchar();
  if (ch == '-') o = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * o;
}
template <typename T>
bool chkmax(T &a, T b) {
  return a < b ? a = b, 1 : 0;
};
template <typename T>
bool chkmin(T &a, T b) {
  return a > b ? a = b, 1 : 0;
};
int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
void inc(int &a, int b) { a = (a + b >= mod ? a + b - mod : a + b); }
void dec(int &a, int b) { a = (a - b < 0 ? a - b + mod : a - b); }
string to_string(string s) { return '"' + s + '"'; }
string to_string(const char *s) { return to_string((string)s); }
string to_string(bool b) { return (b ? "true" : "false"); }
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + "," + to_string(p.second) + ")";
}
template <typename T>
string to_string(T v) {
  int fst = 1;
  string ret = "{";
  for (auto x : v) {
    if (!fst) ret += ",";
    fst = 0, ret += to_string(x);
  }
  ret += "}";
  return ret;
}
void dbg_out() { cerr << endl; }
template <typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) {
  cerr << " " << to_string(H);
  dbg_out(T...);
}
template <typename T>
int qpow(int a, T b) {
  int ret = 1;
  while (b) {
    if (b & 1) ret = 1ll * ret * a % mod;
    a = 1ll * a * a % mod, b >>= 1;
  }
  return ret;
}
const int N = 4e5 + 10;
namespace fenw {
int n, c[N];
void modify(int p, int v) {
  while (p <= n) c[p] += v, p += p & -p;
}
int query(int p) {
  int ret = 0;
  while (p) ret += c[p], p -= p & -p;
  return ret;
}
}  // namespace fenw
int n, q, col[N], tot = 0;
vector<int> E[N];
namespace lct {
int fa[N], ch[N][2], sz[N], tag[N];
bool rev[N];
bool isroot(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
void pushup(int x) { sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1; }
void paint(int x, int c) { col[x] = tag[x] = c; }
void reverse(int x) {
  rev[x] ^= 1;
  swap(ch[x][0], ch[x][1]);
}
void pushdown(int x) {
  if (tag[x]) {
    paint(ch[x][0], tag[x]);
    paint(ch[x][1], tag[x]);
    tag[x] = 0;
  }
  if (rev[x]) {
    reverse(ch[x][0]);
    reverse(ch[x][1]);
    rev[x] = 0;
  }
}
void pushall(int x) {
  if (!isroot(x)) pushall(fa[x]);
  pushdown(x);
}
void rotate(int x) {
  int y = fa[x], z = fa[y], w = ch[y][1] == x;
  if (!isroot(y)) ch[z][ch[z][1] == y] = x;
  ch[y][w] = ch[x][w ^ 1];
  fa[ch[y][w]] = y;
  ch[x][w ^ 1] = y;
  fa[y] = x;
  fa[x] = z;
  pushup(y);
  pushup(x);
}
void splay(int x) {
  pushall(x);
  while (!isroot(x)) {
    int y = fa[x], z = fa[y];
    if (!isroot(y)) (ch[y][0] == x) ^ (ch[z][0] == y) ? rotate(x) : rotate(y);
    rotate(x);
  }
}
void access(int x) {
  for (int t = 0; x; t = x, x = fa[x]) {
    splay(x);
    ch[x][1] = 0;
    pushup(x);
    fenw::modify(col[x], -sz[x]);
    ch[x][1] = t;
    pushup(x);
  }
}
void makeroot(int x, int col) {
  access(x);
  splay(x);
  reverse(x);
  paint(x, col);
  fenw::modify(col, sz[x]);
}
void print() {
  for (int i = 1; i <= n; i++)
    cerr << "{"
         << "i, ch[i][0], ch[i][1], fa[i]"
         << "}:",
        dbg_out(i, ch[i][0], ch[i][1], fa[i]);
}
}  // namespace lct
void adde(int u, int v) {
  E[u].push_back(v);
  E[v].push_back(u);
}
void dfs(int u, int fa) {
  col[u] = u;
  for (auto v : E[u])
    if (v != fa) {
      lct::fa[v] = u;
      dfs(v, u);
      chkmax(col[u], col[v]);
    }
  lct::sz[u] = 1;
  for (auto v : E[u])
    if (v != fa) {
      if (col[u] == col[v]) {
        lct::ch[u][1] = v;
        lct::sz[u] = lct::sz[v] + 1;
      }
    }
  fenw::modify(col[u], 1);
}
char op[10];
int calc(int x) {
  lct::splay(x);
  return fenw::query(col[x]) - lct::sz[lct::ch[x][0]];
}
int main() {
  n = gi(), q = gi();
  for (int i = 1, u, v; i < n; i++) u = gi(), v = gi(), adde(u, v);
  fenw::n = n + q;
  dfs(n, 0);
  tot = n;
  while (q--) {
    scanf("%s", op + 1);
    if (op[1] == 'u') {
      int u = gi();
      lct::makeroot(u, ++tot);
    } else if (op[1] == 'w') {
      int u = gi();
      printf("%d\n", calc(u));
    } else {
      int u = gi(), v = gi();
      printf("%d\n", calc(u) < calc(v) ? u : v);
    }
  }
  return 0;
}
