#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 30;
const int N = 1e3 + 7;
unordered_set<int> g[N];
int vis[N];
int ask(int u, int v) {
  cout << "? " << u << ' ' << v << endl;
  int w;
  cin >> w;
  return w;
}
void answer(int w) {
  cout << "! " << w << endl;
  exit(0);
}
unordered_set<int> l;
int par = -1, dest = -1;
void dfs(int k, int p) {
  for (auto &v : g[k]) {
    if (v == p) continue;
    if (v == dest) {
      par = k;
      return;
    }
    if (par != -1) return;
    dfs(v, k);
  }
}
void dfs_remo(int k, int p) {
  if (g[k].size() == 1 && l.count(k)) {
    l.erase(k);
    return;
  }
  for (auto &v : g[k]) {
    if (v == p) continue;
    dfs_remo(v, k);
  }
}
void remove_tree(int st, int en) {
  dest = en;
  par = -1;
  dfs(st, st);
  g[en].erase(par);
  dfs_remo(par, en);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int tt = clock();
  int n;
  cin >> n;
  for (int i = 1; i < n; ++i) {
    int a, b;
    cin >> a >> b;
    g[a].emplace(b);
    g[b].emplace(a);
  }
  for (int i = 1; i <= n; ++i) {
    if (g[i].size() == 1) l.insert(i);
  }
  while (l.size() > 1) {
    auto f = l.begin();
    auto fl = *f;
    l.erase(f);
    auto s = l.begin();
    auto sl = *s;
    l.erase(s);
    auto k = ask(fl, sl);
    if (k == fl || k == sl) {
      answer(k);
    }
    remove_tree(fl, k);
    remove_tree(sl, k);
    if (g[k].size() <= 1) l.insert(k);
  }
  answer(*l.begin());
  cerr << "TIME = " << (double)1.0 * (clock() - tt) / CLOCKS_PER_SEC
       << " seconds" << endl;
  return 0;
}
