#include <bits/stdc++.h>
using namespace std;
const int max_n = 1000;
vector<vector<int>> adj(max_n);
vector<vector<int>> sz(max_n, vector<int>(max_n, 0));
set<int> included;
int dfs(int node, int parent = -1) {
  if (included.find(node) == included.end()) return 0;
  int count = 1;
  for (int next : adj[node]) {
    if (next != parent) {
      count += dfs(next, node);
    }
  }
  if (parent != -1) {
    sz[node][parent] = included.size() - count;
    return sz[parent][node] = count;
  } else {
    return 0;
  }
}
void dfs_remove(int node, int parent) {
  if (included.find(node) != included.end()) {
    included.erase(node);
    for (int next : adj[node]) {
      if (next != parent) {
        dfs_remove(next, node);
      }
    }
  }
}
int main() {
  int n;
  std::cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int a, b;
    std::cin >> a >> b;
    adj[a - 1].push_back(b - 1);
    adj[b - 1].push_back(a - 1);
  }
  for (int i = 0; i < n; i++) included.insert(i);
  while (included.size() > 1) {
    dfs(*included.begin());
    int pivot = -1;
    for (int i : included) {
      int mx = 0;
      for (int j : adj[i]) {
        if (included.find(j) != included.end()) {
          mx = max(mx, sz[i][j]);
        }
      }
      if (mx <= included.size() / 2) {
        pivot = i;
        break;
      }
    }
    int dir1 = pivot;
    int dir2 = pivot;
    for (int i : adj[pivot]) {
      if (included.find(i) != included.end()) {
        if (sz[pivot][dir1] < sz[pivot][i]) swap(dir1, i);
        if (sz[pivot][dir2] < sz[pivot][i]) swap(dir2, i);
      }
    }
    cout << "? " << dir1 + 1 << " " << dir2 + 1 << endl;
    int result;
    std::cin >> result;
    if (result == -1) return 0;
    result--;
    if (result == pivot) {
      dfs_remove(dir1, pivot);
      if (dir2 != pivot) dfs_remove(dir2, pivot);
    } else if (result == dir1) {
      dfs_remove(pivot, dir1);
    } else {
      dfs_remove(pivot, dir2);
    }
  }
  cout << "! " << (*included.begin()) + 1 << endl;
}
