#include <bits/stdc++.h>
using namespace std;
const long long MAXN = 1010;
long long T, Q, N, M, a, b, c, d, e, first;
long long A[MAXN];
long long B[MAXN];
vector<long long> V[MAXN];
string S;
vector<long long> open, close;
int blk[MAXN];
long long dst[MAXN];
long long p[MAXN];
void dfs(long long x, long long par) {
  for (auto v : V[x])
    if (v != par && !blk[v]) {
      dst[v] = dst[x] + 1;
      p[v] = x;
      dfs(v, x);
    }
}
stack<int> st;
void dfs2(long long x, long long p, long long bl) {
  if (x == bl) return;
  st.push(x);
  for (auto v : V[x])
    if (!blk[v] && v != p) dfs2(v, x, bl);
}
int query(int x, int y) {
  cout << "? " << x << ' ' << y << '\n' << flush;
  int t;
  cin >> t;
  return t;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> N;
  for (int i = 1; i < N; ++i) {
    cin >> a >> b;
    V[a].emplace_back(b);
    V[b].emplace_back(a);
  }
  long long E = N;
  while (E > 1) {
    memset(dst, -1, sizeof(dst));
    memset(p, 0, sizeof(p));
    long long t = 1;
    while (blk[t]) ++t;
    dst[t] = 0;
    dfs(t, -1);
    int furthest = max_element(dst + 1, dst + N + 1) - dst;
    t = furthest;
    memset(dst, -1, sizeof(dst));
    memset(p, 0, sizeof(p));
    dst[t] = 0;
    dfs(t, -1);
    furthest = max_element(dst + 1, dst + N + 1) - dst;
    long long c = query(furthest, t);
    dfs2(t, -1, c);
    dfs2(furthest, -1, c);
    while ((long long)st.size()) {
      int t = st.top();
      st.pop();
      blk[t] = 1;
      --E;
    }
  }
  cout << "! " << min_element(blk + 1, blk + N + 1) - blk;
}
