#include <bits/stdc++.h>
using namespace std;
int n;
struct edge {
  int from;
  int to;
  int len;
  bool vis;
  int next;
} E[100 * 2 + 5];
int esz = 1;
int head[100 + 5];
void addEdge(int u, int v) {
  esz++;
  E[esz].from = u;
  E[esz].to = v;
  E[esz].next = head[u];
  head[u] = esz;
}
vector<int> son[100 + 5];
__int128_t f[100 + 5];
__int128_t g[100 + 5];
bool check(int x) {
  for (int y : son[x]) g[y] = 0;
  for (int i = n; i >= 1; i--) {
    if ((f[x] >> i) & 1) {
      int id = 0;
      for (int y : son[x])
        if (!id || f[y] - g[y] > f[id] - g[id]) id = y;
      g[id] |= __int128_t(1) << i;
    }
  }
  for (int y : son[x])
    if (f[y] >= g[y]) return 0;
  return 1;
}
void setEdge(int x, int fa) {
  for (int i = head[x]; i; i = E[i].next) {
    int y = E[i].to;
    if (y != fa) {
      setEdge(y, x);
      son[x].push_back(y);
    }
  }
  for (int i = 1; i <= n; i++) f[x] |= __int128_t(1) << i;
  for (int i = n; i >= 1; i--) {
    f[x] ^= __int128_t(1) << i;
    if (!check(x)) f[x] ^= __int128_t(1) << i;
  }
  check(x);
  for (int i = head[x]; i; i = E[i].next) {
    int y = E[i].to;
    if (y != fa) {
      for (int j = 1; j <= n; j++) {
        if ((g[y] >> j) & 1) {
          E[i].len = E[i ^ 1].len = j;
          break;
        }
      }
    }
  }
}
void getMax(int x, int fa, int &edg) {
  for (int i = head[x]; i; i = E[i].next) {
    int y = E[i].to;
    if (y != fa && !E[i].vis) {
      if (!edg || E[i].len > E[edg].len) edg = i;
      getMax(y, x, edg);
    }
  }
}
int Ask(int u, int v) {
  int ans;
  printf("? %d %d\n", u, v);
  fflush(stdout);
  scanf("%d", &ans);
  return ans;
}
int main() {
  int u, v;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    addEdge(u, v);
    addEdge(v, u);
  }
  setEdge(1, 0);
  int x = 1, e = 0;
  while (1) {
    e = 0;
    getMax(x, 0, e);
    if (e == 0) break;
    x = Ask(E[e].from, E[e].to);
    E[e].vis = E[e ^ 1].vis = 1;
  }
  printf("! %d\n", x);
}
