#include <bits/stdc++.h>
using namespace std;
bool del[200005];
vector<int> v[200005];
int par[200005], sz[200005], dep[200005], depx;
void pre(int node, int p) {
  for (int u : v[node]) {
    if (u != p) {
      par[u] = node;
      dep[u] = dep[node] + 1;
      pre(u, node);
    }
  }
}
vector<int> h;
int query(char c, int u) {
  printf("%c %d\n", c, u);
  fflush(stdout);
  int ans;
  scanf("%d", &ans);
  return ans;
}
int getsz(int node, int p) {
  sz[node] = 1;
  for (int u : v[node]) {
    if (!del[u] && u != p) sz[node] += getsz(u, node);
  }
  return sz[node];
}
int find(int node, int p, int nn) {
  for (int u : v[node]) {
    if (!del[u] && u != p && sz[u] > nn / 2) return find(u, node, nn);
  }
  return node;
}
int dfs(int node) {
  getsz(node, 0);
  int c = find(node, 0, sz[node]), d = query('d', c);
  if (!d) return c;
  del[c] = 1;
  if (dep[c] + d == depx) return dfs(query('s', c));
  return dfs(par[c]);
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    v[a].push_back(b);
    v[b].push_back(a);
  }
  depx = query('d', 1);
  pre(1, 0);
  printf("! %d\n", dfs(1));
  fflush(stdout);
}
