#include <bits/stdc++.h>
using namespace std;
struct type {
  long long s1, s2;
  int id;
} b[101], s, Inf;
int a[202][3], ls[101], fa[101], id[101], D[101], f[202], F[202], d[202], n, i,
    j, k, l, len, x, y, z, mx, mx2, t;
bool bz[101];
long long p[51];
bool operator<(type a, type b) {
  return !(a.s1 > b.s1 || a.s1 == b.s1 && a.s2 > b.s2);
}
priority_queue<type> hp;
ifstream f1;
void New(int x, int y) {
  ++len;
  a[len][0] = y;
  a[len][1] = ls[x];
  ls[x] = len;
}
type Xor(type s, int t) {
  return (t < 50) ? type{s.s1, s.s2 ^ p[t], s.id}
                  : type{s.s1 ^ p[t - 50], s.s2, s.id};
}
bool Zero(type s) { return !s.s1 && !s.s2; }
type Add(type a) {
  ++a.s2;
  if (a.s2 >= p[50]) a.s2 -= p[50], ++a.s1;
  return a;
}
bool Get(type s, int t) {
  return (t < 50) ? ((s.s2 & p[t]) > 0) : ((s.s1 & p[t - 50]) > 0);
}
bool pd(type a) {
  int i, j, k, l;
  t = 0;
  for (i = n - 1; i >= 0; i--)
    if (Get(a, i)) {
      if (hp.empty()) {
        for (i = 1; i <= t; i++) f[d[i]] = F[d[i]];
        return 1;
      }
      s = hp.top(), hp.pop();
      if (Get(s, i + 1)) return 0;
      if (Get(s, i)) {
        if (!Zero(Xor(s, i)))
          hp.push(Xor(s, i));
        else
          F[s.id] = i, d[++t] = s.id;
      } else
        F[s.id] = i, d[++t] = s.id;
    } else if (!hp.empty()) {
      s = hp.top();
      if (Get(s, i)) return 0;
    }
  if (hp.empty()) {
    for (i = 1; i <= t; i++) f[d[i]] = F[d[i]];
  }
  return hp.empty();
}
void dfs(int Fa, int t) {
  int i, j, k, l;
  fa[t] = Fa;
  if (a[ls[t]][0] == Fa && D[t] == 1) {
    b[t].s1 = b[t].s2 = 0, b[t].id = t;
    return;
  }
  for (i = ls[t]; i; i = a[i][1])
    if (a[i][0] != Fa) id[a[i][0]] = i, dfs(t, a[i][0]);
  b[t] = Inf, b[t].id = t;
  for (i = n - 1; i >= 0; i--) {
    while (!hp.empty()) hp.pop();
    for (l = ls[t]; l; l = a[l][1])
      if (a[l][0] != Fa) hp.push(Add(b[a[l][0]]));
    b[t] = Xor(b[t], i);
    if (!pd(b[t])) b[t] = Xor(b[t], i);
  }
}
void Dfs(int Fa, int t) {
  int i;
  for (i = ls[t]; i; i = a[i][1])
    if (a[i][0] != Fa && !bz[a[i][0]]) {
      if (a[i][2] > mx) mx = a[i][2], mx2 = i;
      Dfs(t, a[i][0]);
    }
}
int Ask(int x, int y) {
  int s;
  printf("? %d %d\n", x, y);
  fflush(stdout);
  scanf("%d", &s);
  return s;
}
void Find(int x) {
  printf("! %d\n", x);
  fflush(stdout);
  exit(0);
}
int main() {
  p[0] = 1;
  for (i = 1; i <= 50; i++) p[i] = p[i - 1] * 2;
  scanf("%d", &n), len = 1;
  for (i = 1; i <= n - 1; i++)
    scanf("%d%d", &j, &k), New(j, k), New(k, j), ++D[j], ++D[k];
  if (n - 1 < 50)
    Inf.s2 = p[n] - 1;
  else
    Inf.s1 = p[n - 50] - 1, Inf.s2 = p[50] - 1;
  f1.close();
  dfs(0, 1);
  for (i = 2; i <= n; i++) a[id[i]][2] = a[id[i] ^ 1][2] = f[i];
  x = 1;
  while (1) {
    mx = -1, Dfs(0, x);
    if (mx == -1) Find(x);
    x = a[mx2][0], y = a[mx2 ^ 1][0];
    z = Ask(x, y), bz[x] = bz[y] = 1, bz[z] = 0, x = z;
  }
  fclose(stdin);
  fclose(stdout);
  return 0;
}
