#include <bits/stdc++.h>
using namespace std;
int sec(int root, int dist, vector<set<int> > &adj, vector<bool> &visited) {
  visited[root] = true;
  if (dist == 0) return root;
  for (int neigh : adj[root]) {
    if (visited[neigh]) continue;
    int b = sec(neigh, dist - 1, adj, visited);
    if (b != -1) return b;
  }
  return -1;
}
void rem(int a, int lca, vector<set<int> > &adj, int &root,
         vector<bool> &visited) {
  visited[a] = true;
  for (int neigh : adj[a]) {
    if (visited[neigh]) continue;
    if (neigh == lca) {
      adj[a].erase(lca);
      adj[lca].erase(a);
      root = lca;
      break;
    }
    rem(neigh, lca, adj, root, visited);
  }
}
int main() {
  int n;
  cin >> n;
  vector<set<int> > adj(n + 1);
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    adj[u].insert(v);
    adj[v].insert(u);
  }
  int root = 1;
  while (adj[root].size() > 0) {
    vector<bool> visited(n + 1);
    int s = sec(root, 2, adj, visited);
    if (s == -1) {
      fill(visited.begin(), visited.end(), false);
      s = sec(root = *(adj[root].begin()), 2, adj, visited);
    }
    if (s == -1) {
      s = *adj[root].begin();
    }
    cout << "? " << root << " " << s << endl;
    int lca;
    cin >> lca;
    fill(visited.begin(), visited.end(), false);
    rem(root, lca, adj, root, visited);
    fill(visited.begin(), visited.end(), false);
    rem(s, lca, adj, root, visited);
  }
  cout << "! " << root << endl;
  return 0;
}
