#include <bits/stdc++.h>
using namespace std;
int n, q, fst[200010], num = 0, en = 0, deg[200010], s[400010];
struct edge {
  int x, y, n;
} e[400010];
struct tree {
  int l, r, col;
  tree *lc, *rc;
  tree(int l, int r) : l(l), r(r), lc(NULL), rc(NULL), col(-1) {}
} * root;
struct pnt {
  int f, s, en, tp, dp, sz;
} p[200010];
priority_queue<int, vector<int>, greater<int>> pq;
int st[400010];
void ins(int x, int y) {
  e[++num] = {x, y, fst[x]};
  fst[x] = num;
}
void dfs1(int x, int fa) {
  p[x].f = fa;
  p[x].dp = p[fa].dp + 1;
  p[x].sz = 1;
  for (int i = fst[x]; i; i = e[i].n) {
    int y = e[i].y;
    if (y == fa) continue;
    dfs1(y, x);
    if (p[y].sz > p[p[x].s].sz) p[x].s = y;
    p[x].sz += p[y].sz;
  }
}
void dfs2(int x, int tp) {
  p[x].tp = tp;
  p[x].en = ++en;
  if (p[x].s) {
    dfs2(p[x].s, tp);
    for (int i = fst[x]; i; i = e[i].n) {
      int y = e[i].y;
      if (y == p[x].f || y == p[x].s) continue;
      dfs2(y, y);
    }
  }
}
void add(int x, int y) {
  for (int i = x; i <= n + q; i += i & -i) s[i] += y;
}
int get(int x) {
  int ans = 0;
  for (int i = x; i > 0; i -= i & -i) ans += s[i];
  return ans;
}
tree *bt(int l, int r) {
  tree *i = new tree(l, r);
  if (l < r) {
    int md = l + r >> 1;
    i->lc = bt(l, md);
    i->rc = bt(md + 1, r);
  }
  return i;
}
void chg(tree *i, int l, int r, int c) {
  if (i->l == l && i->r == r && ~i->col) {
    add(i->col, l - r - 1);
    i->col = c;
    add(c, r - l + 1);
    return;
  } else if (i->l == i->r) {
    i->col = c;
    add(c, 1);
    return;
  }
  if (~i->col) i->lc->col = i->rc->col = i->col;
  int md = i->l + i->r >> 1;
  if (r <= md)
    chg(i->lc, l, r, c);
  else if (l > md)
    chg(i->rc, l, r, c);
  else
    chg(i->lc, l, md, c), chg(i->rc, md + 1, r, c);
  i->col = i->lc->col == i->rc->col ? i->lc->col : -1;
}
int get(tree *i, int x) {
  if (~i->col) return i->col;
  int md = i->l + i->r >> 1;
  if (x <= md)
    return get(i->lc, x);
  else
    return get(i->rc, x);
}
void chg(int x, int y, int c) {
  while (p[x].tp != p[y].tp) {
    if (p[p[x].tp].dp < p[p[y].tp].dp) swap(x, y);
    chg(root, p[p[x].tp].en, p[x].en, c);
    x = p[p[x].tp].f;
  }
  if (p[x].dp > p[y].dp) swap(x, y);
  chg(root, p[x].en, p[y].en, c);
}
int dis(int x, int y) {
  int ans = 0;
  while (p[x].tp != p[y].tp) {
    if (p[p[x].tp].dp < p[p[y].tp].dp) swap(x, y);
    ans += p[x].dp - p[p[x].tp].dp + 1;
    x = p[p[x].tp].f;
  }
  return ans + abs(p[x].dp - p[y].dp) + 1;
}
int when(int x) {
  int col = get(root, p[x].en);
  return get(col - 1) + dis(st[col], x);
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    ins(x, y);
    ins(y, x);
    deg[x]++;
    deg[y]++;
  }
  dfs1(1, 0);
  dfs2(1, 1);
  root = bt(1, n);
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) pq.push(i);
  for (int i = 1; i <= n; i++) {
    int x = pq.top();
    pq.pop();
    chg(root, p[x].en, p[x].en, i);
    st[i] = x;
    for (int j = fst[x]; j; j = e[j].n) {
      int y = e[j].y;
      deg[y]--;
      if (deg[y] == 1) pq.push(y);
    }
  }
  int now = n, last = n;
  for (int i = 0; i < q; i++) {
    char op[10];
    scanf("%s", op);
    if (op[0] == 'u') {
      now++;
      int x;
      scanf("%d", &x);
      chg(last, x, now);
      st[now] = last;
      last = x;
    } else if (op[0] == 'w') {
      int x;
      scanf("%d", &x);
      printf("%d\n", when(x));
    } else {
      int x, y;
      scanf("%d%d", &x, &y);
      printf("%d\n", when(x) < when(y) ? x : y);
    }
  }
}
