#include <bits/stdc++.h>
using namespace std;
vector<vector<long long>> gr;
long long n;
vector<long long> diametr(long long u) {
  queue<long long> q;
  vector<long long> h(n + 1, -1);
  q.push(u);
  h[u] = 0;
  long long ml = u;
  while (!q.empty()) {
    long long v = q.front();
    q.pop();
    for (long long x : gr[v]) {
      if (h[x] == -1) {
        h[x] = h[v] + 1;
        if (h[x] > h[ml]) ml = x;
        q.push(x);
      }
    }
  }
  vector<long long> prev(n + 1, -1);
  h.assign(n + 1, -1);
  q.push(ml);
  h[ml] = 0;
  long long ms = ml;
  prev[ml] = ml;
  while (!q.empty()) {
    long long v = q.front();
    q.pop();
    for (long long x : gr[v]) {
      if (prev[x] == -1) {
        h[x] = h[v] + 1;
        prev[x] = v;
        if (h[x] > h[ms]) ms = x;
        q.push(x);
      }
    }
  }
  vector<long long> res;
  while (prev[ms] != ms) {
    res.push_back(ms);
    ms = prev[ms];
  }
  res.push_back(ms);
  reverse((res).begin(), (res).end());
  return res;
}
void solve() {
  cin >> n;
  gr.resize(n + 1);
  for (long long i = 1; i < n; ++i) {
    long long a, b;
    cin >> a >> b;
    gr[a].push_back(b);
    gr[b].push_back(a);
  }
  long long verticl = 1;
  while (true) {
    vector<long long> diam = diametr(verticl);
    cout << "? " << diam[0] << " " << diam.back() << endl;
    fflush(stdout);
    cout.flush();
    long long x;
    cin >> x;
    long long vi = 0;
    for (long long i = 0; i < (long long)((diam).size()); ++i) {
      if (diam[i] == x) {
        vi = i;
      }
    }
    long long ls = max(0ll, vi - 1);
    long long rs = min((long long)((diam).size()) - 1, vi + 1);
    if (vi != 0) gr[x].erase(find((gr[x]).begin(), (gr[x]).end(), diam[ls]));
    if (vi != (long long)((diam).size()) - 1)
      gr[x].erase(find((gr[x]).begin(), (gr[x]).end(), diam[rs]));
    if (gr[x].size() == 0) {
      cout << "! " << x << endl;
      fflush(stdout);
      cout.flush();
      return;
    } else {
      verticl = x;
    }
  }
}
signed main() {
  solve();
  return 0;
}
