#include <bits/stdc++.h>
using namespace std;
vector<int> v[1010];
int sz[1010], dead[1010];
void dfs(int now, int pv) {
  sz[now] = 1;
  for (auto x : v[now])
    if (x != pv) {
      dfs(x, now);
      sz[now] += sz[x];
    }
}
int main() {
  ios_base::sync_with_stdio(0);
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    cin >> a >> b;
    v[a].push_back(b);
    v[b].push_back(a);
  }
  dfs(1, -1);
  int p = 1, pv = -1, cnt = 0;
  while (1) {
    int mxsz = 0, mxp = -1;
    for (auto x : v[p])
      if (x != pv) {
        if (sz[x] > mxsz) {
          mxsz = sz[x];
          mxp = x;
        }
      }
    if (mxsz > n / 2) {
      pv = p;
      p = mxp;
    } else
      break;
  }
  int nowp = p;
  while (1) {
    int found = 0;
    dead[nowp] = 1;
    vector<int> t;
    for (auto x : v[nowp])
      if (!dead[x]) t.push_back(x);
    if (t.size() == 0) {
      cout << "! " << nowp << endl;
      return 0;
    }
    for (int i = 0; i < t.size() - 1; i += 2) {
      cout << "? " << t[i] << " " << t[i + 1] << endl;
      dead[t[i]] = dead[t[i + 1]] = 1;
      int res;
      cin >> res;
      if (res == t[i]) {
        nowp = t[i];
        found = 1;
        break;
      }
      if (res == t[i + 1]) {
        nowp = t[i + 1];
        found = 1;
        break;
      }
    }
    if (found == 0 && t.size() % 2 == 1) {
      int diu = t.back(), p = 0;
      while (p < v[diu].size() && dead[v[diu][p]]) p++;
      int bb = p < v[diu].size() ? v[diu][p] : diu;
      cout << "? " << nowp << " " << bb << endl;
      dead[bb] = 1;
      int res;
      cin >> res;
      if (res == nowp) {
        cout << "! " << nowp << endl;
        return 0;
      } else {
        found = 1;
        dead[diu] = 1;
        nowp = res;
      }
    }
    if (found == 0) {
      cout << "! " << nowp << endl;
      return 0;
    }
    cnt++;
  }
}
