#include <bits/stdc++.h>
using namespace std;
//
const int maxN = 1e5 + 5;
//
int N, M, root, h[maxN], up[maxN][20];
vector<int> edge[maxN];
//
void reset (void)
{
    root = 1;
    for (int i = 1; i <= N; ++i)
        edge[i].clear();
}
void DFS (int u)
{
    for (int v : edge[u])
    {
        if (v == up[u][0])
            continue;
        h[v] = h[u] + 1;
        up[v][0] = u;
        for (int j = 1; j < 20; ++j)
            up[v][j] = up[up[v][j - 1]][j - 1];
        DFS(v);
    }
}
int LCA (int u, int v)
{
    if (h[u] != h[v])
    {
        if (h[u] < h[v])
            swap(u, v);
        for (int k = h[u] - h[v], i = 0; (1 << i) <= k; ++i)
            if (k >> i & 1)
                u = up[u][i];
    }
    if (u == v)
        return u;
    for (int k = __lg(h[v]); k >= 0; --k)
        if (up[u][k] != up[v][k])
            u = up[u][k], v = up[v][k];
    return up[v][0];
}
int query (int u, int v)
{
    int a = LCA(u, v), b = LCA(u, root), c = LCA(v, root);
    //
    if (b == c)
        return a;
    return c == a ? b : c;
}
//
void process (void)
{
    int M, u, v;
    char type;
    //
    while (cin >> N)
    {
        if (N == 0)
            break;
        reset();
        while (--N)
            cin >> u >> v,
            edge[u].emplace_back(v), edge[v].emplace_back(u);
        DFS(1);
        for (cin >> M; M--;)
        {
            cin >> type;
            if (type == '!')
                cin >> root;
            else
                cin >> u >> v,
                cout << query(u, v) << '\n';
        }
    }
}
//
signed main (void)
{
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    process();
}
