#include <bits/stdc++.h>
using namespace std;
template <class S, class T>
pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) {
  return pair<S, T>(s.first + t.first, s.second + t.second);
}
template <class S, class T>
pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) {
  return pair<S, T>(s.first - t.first, s.second - t.second);
}
template <class S, class T>
ostream &operator<<(ostream &os, pair<S, T> p) {
  os << "(" << p.first << ", " << p.second << ")";
  return os;
}
template <class T>
bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T &a, const T &b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
const long long inf = 1000000001;
const long long INF = (long long)1e18 + 1;
const long double pi = 3.1415926535897932384626433832795028841971L;
vector<int> dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1};
vector<int> dx2 = {1, 1, 0, -1, -1, -1, 0, 1},
            dy2 = {0, 1, 1, 1, 0, -1, -1, -1};
const long long MOD = 1000000007;
int n;
vector<vector<int> > G;
vector<int> used;
vector<int> d;
void dfs(int now, int par, int depth) {
  d[now] = depth;
  for (int i = 0; i < (G[now].size()); i++) {
    int ch = G[now][i];
    if (ch == par) continue;
    if (used[ch]) continue;
    dfs(ch, now, depth + 1);
  }
}
pair<int, int> farest() {
  int r;
  for (int i = 0; i < (n); i++) {
    if (not used[i]) {
      r = i;
      break;
    }
  }
  fill(d.begin(), d.end(), -inf);
  dfs(r, -1, 0);
  pair<int, int> ma(-1, inf);
  for (int i = 0; i < (n); i++) {
    chmax(ma, pair<int, int>(d[i], i));
  }
  int u = ma.second;
  fill(d.begin(), d.end(), -inf);
  dfs(u, -1, 0);
  ma = pair<int, int>(-1, inf);
  for (int i = 0; i < (n); i++) {
    chmax(ma, pair<int, int>(d[i], i));
  }
  int v = ma.second;
  return pair<int, int>(u, v);
}
bool dfs2(int now, int par, int tar, vector<int> &path) {
  path.push_back(now);
  if (now == tar) {
    return true;
  }
  for (int i = 0; i < (G[now].size()); i++) {
    int ch = G[now][i];
    if (ch == par) continue;
    if (used[ch]) continue;
    if (dfs2(ch, now, tar, path)) {
      return true;
    }
  }
  path.pop_back();
  return false;
}
int ask(int u, int v) {
  cout << "? " << u + 1 << " " << v + 1 << endl << flush;
  int res;
  cin >> res;
  res--;
  return res;
}
void ans(int u) { cout << "! " << u + 1 << endl << flush; }
void dfs3(int now, int par) {
  used[now] = true;
  for (int i = 0; i < (G[now].size()); i++) {
    int ch = G[now][i];
    if (ch == par) continue;
    if (used[ch]) continue;
    dfs3(ch, now);
  }
}
void mid(int u, int v) {
  vector<int> path;
  dfs2(u, -1, v, path);
  if (path.size() == 1) {
    ans(path[0]);
    exit(0);
  }
  if (path.size() <= 3) {
    int w = ask(path[0], path.back());
    if (w == path[0] or w == path.back()) {
      ans(w);
      exit(0);
    } else {
      used[path[0]] = true;
      used[path.back()] = true;
    }
  } else {
    int m = path.size();
    int u = path[m / 2 - 1], v = path[m / 2];
    int w = ask(u, v);
    int make;
    if (w == u)
      make = v;
    else
      make = u;
    dfs3(make, w);
  }
}
signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  ;
  cin >> n;
  G.resize(n);
  d.resize(n);
  used.resize(n);
  for (int i = 0; i < (n - 1); i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  for (int _ = 0; _ < (n / 2); _++) {
    pair<int, int> uv = farest();
    mid(uv.first, uv.second);
  }
  for (int i = 0; i < (n); i++) {
    if (not used[i]) {
      ans(i);
      return 0;
    }
  }
}
