#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
int n;
struct edge {
  int v, nxt;
} e[maxn << 1];
int head[maxn], ecnt = 0;
int siz[maxn], mxsiz[maxn], root = 0, S = 0;
void add(int u, int v) {
  e[++ecnt] = (edge){v, head[u]}, head[u] = ecnt;
  e[++ecnt] = (edge){u, head[v]}, head[v] = ecnt;
}
bool vis[maxn];
void dfs1(int u, int pre) {
  siz[u] = 1;
  for (int i = head[u]; ~i; i = e[i].nxt) {
    int v = e[i].v;
    if (vis[v] || v == pre) continue;
    dfs1(v, u);
    siz[u] += siz[v];
  }
}
void dfs2(int u, int pre) {
  mxsiz[u] = 0;
  for (int i = head[u]; ~i; i = e[i].nxt) {
    int v = e[i].v;
    if (vis[v] || v == pre) continue;
    dfs2(v, u);
    mxsiz[u] = max(mxsiz[u], siz[v]);
  }
  mxsiz[u] = max(S - siz[u], mxsiz[u]);
  if (mxsiz[u] < mxsiz[root]) root = u;
}
int stk[maxn], top = 0;
int getans(int u, int v) {
  int w;
  cout << "? " << u << " " << v << endl;
  cout.flush();
  cin >> w;
  return w;
}
bool cmp(int a, int b) { return siz[a] > siz[b]; }
int solve(int u) {
  dfs1(u, 0);
  S = siz[u];
  mxsiz[root = 0] = 0x3f3f3f3f;
  dfs2(u, 0);
  u = root;
  vis[u] = 1;
  top = 0;
  dfs1(u, 0);
  for (int i = head[u]; ~i; i = e[i].nxt) {
    int v = e[i].v;
    if (vis[v]) continue;
    stk[++top] = v;
  }
  sort(stk + 1, stk + 1 + top, cmp);
  for (int i = 2; i <= top; i += 2) {
    int w = getans(stk[i - 1], stk[i]);
    if (w != u) return solve(w);
  }
  if (top & 1) {
    int w = getans(u, stk[top]);
    if (w != u) return solve(w);
  }
  return u;
}
int main() {
  memset(head, -1, sizeof(head));
  cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    add(u, v);
  }
  cout << "! " << solve(1) << endl;
}
