#include <bits/stdc++.h>
using namespace std;
const long long INF = 1LL << 60;
const int INF_INT = 1 << 25;
const long long MOD = 1e9 + 7;
template <class T>
using vec = vector<T>;
template <class T>
using vvec = vector<vec<T>>;
const int loose = 0;
const int tight = 1;
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
struct Edge {
  long long to, cap, rev;
  Edge(long long _to, long long _cap, long long _rev) {
    to = _to;
    cap = _cap;
    rev = _rev;
  }
};
void add_edge(vector<vector<Edge>>& G, long long from, long long to,
              long long cap, bool revFlag, long long revCap) {
  G[from].push_back(Edge(to, cap, (long long)G[to].size()));
  if (revFlag)
    G[to].push_back(Edge(from, revCap, (long long)G[from].size() - 1));
}
void solve_c() {
  long long n, m;
  cin >> n >> m;
  vector<long long> a(n);
  for (long long(i) = 0; (i) < (n); (i)++) cin >> a[i];
  if (n > m) {
    cout << 0 << endl;
    return;
  }
  long long ans = 1;
  for (long long(i) = 0; (i) < (n); (i)++) {
    for (long long(j) = (i + 1); (j) < (n); (j)++) {
      (ans *= abs(a[i] - a[j]) % m) %= m;
    }
  }
  cout << ans << endl;
}
void solve_d() {
  long long n;
  cin >> n;
  vector<vector<Edge>> g(n);
  vector<long long> in(n, 0);
  for (long long(i) = 0; (i) < (n - 1); (i)++) {
    long long a, b;
    cin >> a >> b;
    a--;
    b--;
    add_edge(g, a, b, 1, true, 1);
    in[a]++;
    in[b]++;
  }
  vector<long long> used(n, false);
  long long root = -1;
  queue<long long> que;
  for (long long(i) = 0; (i) < (n); (i)++) {
    if (in[i] == 1) {
      que.push(i);
      used[i] = true;
    }
  }
  for (long long(i) = 0; (i) < (n / 2); (i)++) {
    long long u = que.front();
    que.pop();
    long long v = que.front();
    que.pop();
    cout << "? " << u + 1 << " " << v + 1 << endl;
    long long w;
    cin >> w;
    w--;
    if (u == w || v == w) {
      cout << "! " << w + 1 << endl;
      return;
    }
    root = w;
    for (auto e : g[u]) {
      if (used[e.to]) continue;
      in[e.to]--;
      if (in[e.to] != 1) continue;
      que.push(e.to);
      used[e.to] = true;
    }
    for (auto e : g[v]) {
      if (used[e.to]) continue;
      in[e.to]--;
      if (in[e.to] != 1) continue;
      que.push(e.to);
      used[e.to] = true;
    }
  }
  cout << "! " << root + 1 << endl;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  solve_d();
  return 0;
}
