#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 1e3 + 3;
int n;
vector<int> G[MAX_N];
bool visited[MAX_N];
int ans = 1;
bool v[MAX_N];
bool getpath(vector<int> &p, int now, int tar) {
  if (now == tar) return true;
  bool f = false;
  v[now] = true;
  for (auto &i : G[now]) {
    if (v[i]) continue;
    p.emplace_back(i);
    f = getpath(p, i, tar);
    if (f) break;
    p.pop_back();
  }
  v[now] = false;
  return f;
}
void erase(int now, int pa) {
  visited[now] = true;
  for (auto &i : G[now])
    if (i != pa) erase(i, now);
  G[now].clear();
}
int main() {
  scanf("%d", &n);
  for (int i = 1, t1, t2; i < n; i++) {
    scanf("%d%d", &t1, &t2);
    G[t1].emplace_back(t2);
    G[t2].emplace_back(t1);
  }
  while (1) {
    int l = -1, r = -1;
    for (int i = 1; i <= n; i++)
      if (G[i].size() == 1) {
        if (l == -1)
          l = i;
        else if (r == -1) {
          r = i;
          break;
        }
      }
    if (r == -1) break;
    printf("? %d %d\n", l, r);
    fflush(stdout);
    int in;
    scanf("%d", &in);
    ans = in;
    vector<int> p;
    memset(v, false, sizeof(v));
    getpath(p, in, l);
    if (!p.empty()) {
      for (int i = 0; i < (int)G[in].size(); i++)
        if (G[in][i] == p[0]) {
          G[in].erase(G[in].begin() + i);
          break;
        }
      erase(p[0], in);
    }
    p.clear();
    memset(v, false, sizeof(v));
    if (!G[r].empty()) getpath(p, in, r);
    if (!p.empty()) {
      for (int i = 0; i < (int)G[in].size(); i++)
        if (G[in][i] == p[0]) {
          G[in].erase(G[in].begin() + i);
          break;
        }
      erase(p[0], in);
    }
  }
  for (int i = 1; i <= n; i++)
    if (!visited[i]) ans = i;
  printf("! %d\n", ans);
  fflush(stdout);
  return 0;
}
