package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n int
fmt.Fscan(reader, &n)
adj := make([][]int, n+1)
for i := 0; i < n-1; i++ {
var u, v int
fmt.Fscan(reader, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
depth := make([]int, n+1)
sz := make([]int, n+1)
heavy := make([]int, n+1)
var dfs func(int, int, int)
dfs = func(u, p, d int) {
depth[u] = d
sz[u] = 1
maxSub := 0
for _, v := range adj[u] {
if v != p {
dfs(v, u, d+1)
sz[u] += sz[v]
if sz[v] > maxSub {
maxSub = sz[v]
heavy[u] = v
}
}
}
}
dfs(1, 0, 0)
queryD := func(u int) int {
fmt.Fprintf(writer, "d %d\n", u)
writer.Flush()
var d int
fmt.Fscan(reader, &d)
return d
}
queryS := func(u int) int {
fmt.Fprintf(writer, "s %d\n", u)
writer.Flush()
var s int
fmt.Fscan(reader, &s)
return s
}
D := queryD(1)
u := 1
for {
if depth[u] == D {
fmt.Fprintf(writer, "! %d\n", u)
writer.Flush()
return
}
b := u
for heavy[b] != 0 {
b = heavy[b]
}
Db := queryD(b)
distUv := (depth[b] + D - 2*depth[u] - Db) / 2
v := u
for i := 0; i < distUv; i++ {
v = heavy[v]
}
if depth[v] == D {
fmt.Fprintf(writer, "! %d\n", v)
writer.Flush()
return
}
u = queryS(v)
}
}