```go
package main
import (
"bufio"
"bytes"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Buffer(make([]byte, 1024*1024), 1024*1024*10)
scanner.Split(bufio.ScanWords)
scanInt := func() int {
scanner.Scan()
res, _ := strconv.Atoi(scanner.Text())
return res
}
if !scanner.Scan() {
return
}
n, _ := strconv.Atoi(scanner.Text())
m := scanInt()
k := scanInt()
dp := make([]int, n+1)
for i := 1; i <= n; i++ {
dp[i] = 1000000000
}
dp[k] = 0
for i := 0; i < m; i++ {
x := scanInt()
y := scanInt()
valX := dp[y]
if dp[x]+1 < valX {
valX = dp[x] + 1
}
valY := dp[x]
if dp[y]+1 < valY {
valY = dp[y] + 1
}
dp[x] = valX
dp[y] = valY
}
var out bytes.Buffer
for i := 1; i <= n; i++ {
if dp[i] > m {
out.WriteString("-1 ")
} else {
out.WriteString(strconv.Itoa(dp[i]) + " ")
}
}
fmt.Println(out.String())
}
```