#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();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8vCmNvbnN0IGludCBtYXhOID0gMWU1ICsgNTsKLy8KaW50IE4sIE0sIHJvb3QsIGhbbWF4Tl0sIHVwW21heE5dWzIwXTsKdmVjdG9yPGludD4gZWRnZVttYXhOXTsKLy8Kdm9pZCByZXNldCAodm9pZCkKewogICAgcm9vdCA9IDE7CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBOOyArK2kpCiAgICAgICAgZWRnZVtpXS5jbGVhcigpOwp9CnZvaWQgREZTIChpbnQgdSkKewogICAgZm9yIChpbnQgdiA6IGVkZ2VbdV0pCiAgICB7CiAgICAgICAgaWYgKHYgPT0gdXBbdV1bMF0pCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGhbdl0gPSBoW3VdICsgMTsKICAgICAgICB1cFt2XVswXSA9IHU7CiAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCAyMDsgKytqKQogICAgICAgICAgICB1cFt2XVtqXSA9IHVwW3VwW3ZdW2ogLSAxXV1baiAtIDFdOwogICAgICAgIERGUyh2KTsKICAgIH0KfQppbnQgTENBIChpbnQgdSwgaW50IHYpCnsKICAgIGlmIChoW3VdICE9IGhbdl0pCiAgICB7CiAgICAgICAgaWYgKGhbdV0gPCBoW3ZdKQogICAgICAgICAgICBzd2FwKHUsIHYpOwogICAgICAgIGZvciAoaW50IGsgPSBoW3VdIC0gaFt2XSwgaSA9IDA7ICgxIDw8IGkpIDw9IGs7ICsraSkKICAgICAgICAgICAgaWYgKGsgPj4gaSAmIDEpCiAgICAgICAgICAgICAgICB1ID0gdXBbdV1baV07CiAgICB9CiAgICBpZiAodSA9PSB2KQogICAgICAgIHJldHVybiB1OwogICAgZm9yIChpbnQgayA9IF9fbGcoaFt2XSk7IGsgPj0gMDsgLS1rKQogICAgICAgIGlmICh1cFt1XVtrXSAhPSB1cFt2XVtrXSkKICAgICAgICAgICAgdSA9IHVwW3VdW2tdLCB2ID0gdXBbdl1ba107CiAgICByZXR1cm4gdXBbdl1bMF07Cn0KaW50IHF1ZXJ5IChpbnQgdSwgaW50IHYpCnsKICAgIGludCBhID0gTENBKHUsIHYpLCBiID0gTENBKHUsIHJvb3QpLCBjID0gTENBKHYsIHJvb3QpOwogICAgLy8KICAgIGlmIChiID09IGMpCiAgICAgICAgcmV0dXJuIGE7CiAgICByZXR1cm4gYyA9PSBhID8gYiA6IGM7Cn0KLy8Kdm9pZCBwcm9jZXNzICh2b2lkKQp7CiAgICBpbnQgTSwgdSwgdjsKICAgIGNoYXIgdHlwZTsKICAgIC8vCiAgICB3aGlsZSAoY2luID4+IE4pCiAgICB7CiAgICAgICAgaWYgKE4gPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgcmVzZXQoKTsKICAgICAgICB3aGlsZSAoLS1OKQogICAgICAgICAgICBjaW4gPj4gdSA+PiB2LAogICAgICAgICAgICBlZGdlW3VdLmVtcGxhY2VfYmFjayh2KSwgZWRnZVt2XS5lbXBsYWNlX2JhY2sodSk7CiAgICAgICAgREZTKDEpOwogICAgICAgIGZvciAoY2luID4+IE07IE0tLTspCiAgICAgICAgewogICAgICAgICAgICBjaW4gPj4gdHlwZTsKICAgICAgICAgICAgaWYgKHR5cGUgPT0gJyEnKQogICAgICAgICAgICAgICAgY2luID4+IHJvb3Q7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNpbiA+PiB1ID4+IHYsCiAgICAgICAgICAgICAgICBjb3V0IDw8IHF1ZXJ5KHUsIHYpIDw8ICdcbic7CiAgICAgICAgfQogICAgfQp9Ci8vCnNpZ25lZCBtYWluICh2b2lkKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKSwgY2luLnRpZShudWxscHRyKSwgY291dC50aWUobnVsbHB0cik7CiAgICBwcm9jZXNzKCk7Cn0K