#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  scanf("%d", &n);
  const int N = 105;
  static vector<int> E[N];
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    E[x].push_back(y);
    E[y].push_back(x);
  }
  static int pa[N], sz[N], rk[N];
  function<__int128(int, int)> dfs = [&](int u, int p) -> __int128 {
    pa[u] = p;
    vector<pair<__int128, int>> pos;
    sz[u] = 1;
    for (int v : E[u])
      if (v != p) pos.emplace_back(dfs(v, u), v), sz[u] += sz[v];
    if (pos.empty()) return 0;
    int n = sz[u] - 1;
    auto check = [&](__int128 v) -> bool {
      priority_queue<pair<__int128, int>> queue;
      for (auto& po : pos) queue.push(po);
      for (int i = n - 1; i >= 0; i--)
        if (v >> i & 1) {
          if (queue.empty()) return true;
          auto& top = queue.top();
          __int128 x = __int128(1) << i;
          __int128 y = top.first;
          int z = top.second;
          queue.pop();
          if (x <= y) {
            if (!(y & x)) return false;
            y ^= x;
            queue.emplace(y, z);
          }
          rk[z] = i;
        }
      return queue.empty();
    };
    __int128 po = (__int128(1) << n) - 1;
    int cur = n - 1;
    while (cur >= 0) {
      if (check(po ^ (__int128(1) << cur))) po ^= (__int128(1) << cur);
      cur--;
    }
    assert(check(po));
    return po;
  };
  dfs(1, 0);
  rk[1] = -1;
  auto cut_edge = [&](int x, int y) {
    E[x].erase(find(E[x].begin(), E[x].end(), y));
    E[y].erase(find(E[y].begin(), E[y].end(), x));
  };
  auto get_rk = [&](int x, int y) -> pair<int, int> {
    if (pa[x] == y)
      return {rk[x], x};
    else
      return {rk[y], y};
  };
  function<pair<int, int>(int, int)> dfs_max = [&](int u,
                                                   int p) -> pair<int, int> {
    pair<int, int> mn = get_rk(u, p);
    for (int v : E[u])
      if (v != p) mn = max(dfs_max(v, u), mn);
    return mn;
  };
  int cur = 1;
  while (E[cur].size()) {
    pair<int, int> rk_val = dfs_max(cur, 0);
    cut_edge(rk_val.second, pa[rk_val.second]);
    printf("? %d %d\n", rk_val.second, pa[rk_val.second]);
    fflush(stdout);
    scanf("%d", &cur);
  }
  printf("! %d\n", cur);
  return 0;
}
