#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
template <class T>
void read(T &x) {
  int sgn = 1;
  char ch;
  x = 0;
  for (ch = getchar(); (ch < '0' || ch > '9') && ch != '-'; ch = getchar())
    ;
  if (ch == '-') ch = getchar(), sgn = -1;
  for (; '0' <= ch && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
  x *= sgn;
}
template <class T>
void write(T x) {
  if (x < 0)
    putchar('-'), write(-x);
  else if (x < 10)
    putchar(x + '0');
  else
    write(x / 10), putchar(x % 10 + '0');
}
int n, m, deg[N], root;
vector<int> tree[N];
bool vis[N];
int make_query(int u, int v) {
  printf("? %d %d\n", u, v);
  fflush(stdout);
  int w;
  scanf("%d", &w);
  fflush(stdout);
  return w;
}
int main() {
  read(n);
  for (int i = 1; i <= n; i++) deg[i] = 0, vis[i] = true;
  for (int i = 1; i < n; i++) {
    int u, v;
    read(u), read(v);
    tree[u].push_back(v), tree[v].push_back(u);
    deg[u]++, deg[v]++;
  }
  m = n;
  for (int i = 1; i <= n; i++) vis[i] = true;
  for (int i = 1; i <= (n + 1) / 2; i++) {
    vector<int> leaf;
    for (int j = 1; j <= n; j++) {
      if (vis[j] && deg[j] <= 1) leaf.push_back(j);
    }
    if (leaf.size() <= 1) {
      root = leaf[0];
      break;
    } else {
      int u = leaf[0], v = leaf[1];
      int w = make_query(u, v);
      if (w == u || w == v) {
        root = w;
        break;
      } else {
        vis[u] = vis[v] = false;
        for (int j = 0; j < tree[u].size(); j++) {
          int x = tree[u][j];
          if (vis[x]) deg[x]--;
        }
        for (int j = 0; j < tree[v].size(); j++) {
          int x = tree[v][j];
          if (vis[x]) deg[x]--;
        }
      }
    }
  }
  printf("! %d\n", root);
  fflush(stdout);
  return 0;
}
