#include <bits/stdc++.h>
using namespace std;
inline void read(int &x) {
  int v = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void read(long long &x) {
  long long v = 0ll, f = 1ll;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-')
    f = -1;
  else
    v = (c & 15);
  while (isdigit(c = getchar())) v = (v << 1) + (v << 3) + (c & 15);
  x = v * f;
}
inline void readc(char &x) {
  char c;
  while (((c = getchar()) == ' ') || c == '\n')
    ;
  x = c;
}
int n, m, i, j, sz[105], fa[105], wei[105], ban[105], rt, vis[105];
vector<int> f[105];
vector<int> e[105];
bool cmp(vector<int> a, vector<int> b) {
  if (a.size() != b.size()) return a.size() < b.size();
  int i;
  for (((i)) = (((int)(a.size())) - 1); ((i)) >= (0); ((i))--)
    if (a[i] != b[i]) return a[i] < b[i];
  return 0;
}
bool check(vector<int> f, vector<vector<int> > v) {
  if (v.empty()) return 1;
  int i, j;
  for (i = f.size() - 1; i >= 0; i--) {
    if (f[i]) {
      int t = 0;
      for (((j)) = (0); ((j)) <= (((int)(v.size())) - 1); ((j))++) {
        if (cmp(v[t], v[j])) t = j;
      }
      if (v[t].size() <= i) {
        v[t].clear();
        continue;
      }
      if (!v[t].empty()) v[t].pop_back();
      while (!v[t].empty() && v[t].back() == 0) v[t].pop_back();
    }
    for (((j)) = (0); ((j)) <= (((int)(v.size())) - 1); ((j))++) {
      if (v[j].size() > i) return 0;
    }
  }
  return 1;
}
void dfs1(int x, int p) {
  fa[x] = p;
  sz[x] = 1;
  vector<vector<int> > v;
  vector<int> id;
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++) {
    if (*it != p) {
      dfs1(*it, x);
      sz[x] += sz[*it];
      v.push_back(f[*it]);
      id.push_back(*it);
    }
  }
  f[x].resize(sz[x]);
  int i, j;
  for (((i)) = (0); ((i)) <= (((int)(sz[x])) - 1); ((i))++) f[x][i] = 1;
  for (((i)) = (((int)(sz[x])) - 1); ((i)) >= (0); ((i))--) {
    f[x][i] = 0;
    if (!check(f[x], v)) f[x][i] = 1;
  }
  memset((vis), (0), (sizeof((vis))));
  for (i = f[x].size() - 1; i >= 0; i--) {
    if (f[x][i]) {
      int t = 0;
      for (((j)) = (0); ((j)) <= (((int)(v.size())) - 1); ((j))++) {
        if (cmp(v[t], v[j])) t = j;
      }
      if (!vis[t] && v[t].size() <= i) {
        wei[id[t]] = i;
        vis[t] = 1;
        v[t].clear();
        continue;
      }
      if (!v[t].empty()) v[t].pop_back();
      while (!v[t].empty() && v[t].back() == 0) v[t].pop_back();
    }
  }
  if (x != 1) {
    wei[x] = 0;
    while (f[x][wei[x]]) {
      f[x][wei[x]] = 0;
      wei[x]++;
    }
    f[x][wei[x]] = 1;
    while (f[x].back() == 0) f[x].pop_back();
  }
}
int gwei(int x, int y) {
  if (fa[x] == y) return wei[x];
  return wei[y];
}
void dfs2(int x, int p) {
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++)
    if (*it != p && !ban[*it]) {
      if (rt == -1 || gwei(rt, fa[rt]) < gwei(x, *it)) {
        if (fa[x] == *it)
          rt = x;
        else
          rt = *it;
      }
      dfs2(*it, x);
    }
}
void dfs3(int x, int p) {
  ban[x] = 1;
  for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++)
    if (*it != p && !ban[*it]) {
      dfs3(*it, x);
    }
}
int main() {
  scanf("%d", &n);
  for (((i)) = (1); ((i)) <= ((n - 1)); ((i))++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e[x].push_back(y);
    e[y].push_back(x);
  }
  dfs1(1, 0);
  for (;;) {
    for (((i)) = (1); ((i)) <= ((n)); ((i))++)
      if (!ban[i]) break;
    rt = -1;
    dfs2(i, 0);
    if (rt == -1) {
      printf("! %d\n", i);
      fflush(stdout);
      return 0;
    }
    printf("? %d %d\n", rt, fa[rt]);
    fflush(stdout);
    int t;
    scanf("%d", &t);
    if (t == rt)
      dfs3(fa[rt], rt);
    else
      dfs3(rt, fa[rt]);
  }
  return 0;
}
