#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vii = vector<int>;
using pii = pair<int, int>;
template <typename T = vii>
using vec = vector<T>;
const ll INF = 1e18, MOD = 1e9 + 7;
const int MAX = 1e6;
vec<> adj;
vii s_size;
int dfs0(int curr = 0, int prev = -1) {
  s_size[curr] = 1;
  for (int node : adj[curr]) {
    if (node == prev) {
      continue;
    }
    s_size[curr] += dfs0(node, curr);
  }
  return s_size[curr];
}
vii heavy_path;
void dfs1(int curr = 0, int prev = -1) {
  while (true) {
    heavy_path.push_back(curr);
    int max_sub = 0, next_node = -1;
    for (int node : adj[curr]) {
      if (node == prev) {
        continue;
      }
      if (s_size[node] > max_sub) {
        next_node = node;
        max_sub = s_size[node];
      }
    }
    if (next_node != -1) {
      prev = curr;
      curr = next_node;
    } else {
      break;
    }
  }
}
int dist(int u) {
  cout << "d " << (u + 1) << endl;
  int res;
  cin >> res;
  assert(res != -1);
  return res;
}
int get_node(int u, int d) { return heavy_path[d]; }
int get_node(int u) {
  cout << "s " << (u + 1) << endl;
  int res;
  cin >> res;
  return res - 1;
}
void output(int u) { cout << "! " << (u + 1) << endl; }
int main() {
  int n;
  cin >> n;
  adj.resize(n);
  s_size.resize(n);
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  dfs0();
  int u = 0, x = dist(u);
  dfs1();
  while (true) {
    if (x == 0) {
      output(u);
      break;
    }
    const int v = heavy_path.back();
    const int y = dist(v), z = heavy_path.size() - 1;
    const int b = (x + y - z) / 2;
    if (b == 0) {
      output(get_node(u, z - y));
      break;
    }
    int w = get_node(get_node(u, x - b));
    heavy_path.clear();
    dfs1(w, u);
    u = w, x = b - 1;
  }
}
