#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e3 + 2;
int n, r;
set<int> adj[MAX];
set<int> cand;
int ask(int u, int v) {
  cout << "? " << u << " " << v << '\n';
  cout.flush();
  int w;
  cin >> w;
  return w;
}
void answer(int ret) {
  cout << "! " << ret << '\n';
  cout.flush();
}
void purge(int u, int last, int blocked) {
  if (cand.find(u) != cand.end()) cand.erase(u);
  for (int v : adj[u]) {
    if (v == last) continue;
    if (v == blocked)
      adj[v].erase(u);
    else if (adj[v].size() != 0)
      purge(v, u, blocked);
  }
  adj[u].clear();
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  ;
  cin >> n;
  for (int i = 0, u, v; i < n - 1; i++) {
    cin >> u >> v;
    adj[u].insert(v);
    adj[v].insert(u);
  }
  for (int i = 1; i <= n; i++) {
    if (adj[i].size() == 1) cand.insert(i);
  }
  int ans = 0;
  for (int tt = 0, u, v, w; tt <= n / 2; tt++) {
    if (cand.size() == 1) {
      ans = *cand.begin();
      break;
    }
    u = *cand.begin();
    cand.erase(u);
    v = *cand.begin();
    cand.erase(v);
    w = ask(u, v);
    if (w == u || w == v) {
      ans = w;
      break;
    } else {
      purge(u, -1, w);
      purge(v, -1, w);
      if (adj[w].size() <= 1) cand.insert(w);
    }
  }
  answer(ans);
}
