#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
vector<int> adj[N];
int sum1[N], now1, wow, cac1, level[N];
bool used[N];
void dfs(int x, int p) {
  if (level[x] == now1) {
    sum1[x]++;
  }
  for (int i = 0; i < adj[x].size(); i++) {
    if (adj[x][i] != p) {
      level[adj[x][i]] = level[x] + 1;
      dfs(adj[x][i], x);
      sum1[x] += sum1[adj[x][i]];
    }
  }
}
void dfs1(int x, int p) {
  sum1[x] = 0;
  if (level[x] == now1) {
    sum1[x]++;
  }
  for (int i = 0; i < adj[x].size(); i++) {
    if (adj[x][i] != p && !used[adj[x][i]]) {
      dfs1(adj[x][i], x);
      sum1[x] += sum1[adj[x][i]];
    }
  }
}
int findcen(int x, int p, int sz) {
  for (int i = 0; i < adj[x].size(); i++) {
    if (adj[x][i] != p && sum1[adj[x][i]] > sz / 2 && !used[adj[x][i]]) {
      return findcen(adj[x][i], x, sz);
    }
  }
  return x;
}
void findans(int x, int p, int sz) {
  if (sz == 1) {
    cac1 = x;
    return;
  }
  dfs1(x, x);
  int mid = findcen(x, x, sz);
  used[mid] = true;
  cout << "d " << mid << endl;
  fflush(stdout);
  cin >> wow;
  if (wow + level[mid] == now1) {
    if (wow == 0) {
      cout << "! " << mid << endl;
      fflush(stdout);
      exit(0);
    }
    cout << "s " << mid << endl;
    fflush(stdout);
    cin >> wow;
    findans(wow, wow, sum1[wow]);
  } else {
    findans(x, x, sz - sum1[mid]);
  }
}
int dfs2(int x, int p) {
  if (level[x] == now1) {
    return x;
  }
  int i, j;
  for (i = 0; i < adj[x].size(); i++) {
    if (adj[x][i] != p && !used[adj[x][i]]) {
      j = dfs2(adj[x][i], x);
      if (j != -1) {
        return j;
      }
    }
  }
  return -1;
}
int main() {
  int n, i, j, k;
  cin >> n;
  for (i = 1; i < n; i++) {
    cin >> j >> k;
    adj[j].push_back(k);
    adj[k].push_back(j);
  }
  cout << "d 1" << endl;
  fflush(stdout);
  cin >> now1;
  dfs(1, 1);
  findans(1, 1, sum1[1]);
  i = dfs2(cac1, cac1);
  cout << "! " << i << endl;
  fflush(stdout);
}
