#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int n, vis[maxn];
vector<int> G[maxn];
map<pair<int, int>, int> mp;
struct num {
  int id;
  bitset<maxn> b;
  bool operator<(const num &o) const {
    for (int i = n - 1; ~i; i--) {
      if (b[i] ^ o.b[i]) return b[i] < o.b[i];
    }
    return 0;
  };
  int get() {
    for (int i = n - 1; ~i; i--) {
      if (b.test(i)) return i;
    }
    return -1;
  }
} f[maxn];
int main() {
  scanf("%d", &n);
  for (int i = 1, u, v; i < n; i++) {
    scanf("%d %d", &u, &v);
    G[u].push_back(v), G[v].push_back(u);
  }
  function<void(int, int)> dfs = [&](int v, int fa) {
    vector<num> son;
    for (int u : G[v])
      if (u ^ fa) {
        dfs(u, v), son.push_back(f[u]);
      }
    f[v].id = v;
    auto chk = [&]() {
      priority_queue<num> Q;
      for (auto x : son) Q.push(x);
      if (Q.empty()) return 1;
      for (int i = n - 1; ~i; i--)
        if (f[v].b.test(i)) {
          auto x = Q.top();
          Q.pop();
          int t = x.get();
          if (t > i) return 0;
          if (t == i) x.b[i] = 0, Q.push(x);
          if (Q.empty()) return 1;
        }
      return 0;
    };
    for (int i = 0; i < n; i++) {
      f[v].b[i] = 1;
    }
    for (int i = n - 1; ~i; i--) {
      f[v].b[i] = 0;
      if (!chk()) f[v].b[i] = 1;
    }
    auto col = [&]() {
      priority_queue<num> Q;
      for (auto x : son) Q.push(x);
      if (Q.empty()) return;
      for (int i = n - 1; ~i; i--)
        if (f[v].b.test(i)) {
          auto x = Q.top();
          Q.pop();
          if (x.get() == i)
            x.b[i] = 0, Q.push(x);
          else
            mp[{v, x.id}] = mp[{x.id, v}] = i;
          if (Q.empty()) return;
        }
    };
    col();
  };
  dfs(1, 1);
  function<void(int, int)> solve = [&](int v, int fa) {
    int mx = -1;
    pair<int, int> e;
    function<void(int, int)> dfs = [&](int v, int fa) {
      for (int u : G[v])
        if (u ^ fa && !vis[u]) {
          if (mp[{u, v}] > mx) mx = mp[{u, v}], e = {u, v};
          dfs(u, v);
        }
    };
    dfs(v, fa);
    if (!~mx) printf("! %d\n", v), exit(0);
    printf("? %d %d\n", e.first, e.second), fflush(stdout);
    int x;
    scanf("%d", &x);
    if (x == e.second) swap(e.first, e.second);
    vis[e.second] = 1, solve(e.first, e.first);
  };
  solve(1, 1);
  return 0;
}
