```go
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n, m int
if _, err := fmt.Fscan(reader, &n, &m); err != nil {
return
}
grid := make([]string, n)
var sx, sy int
for i := 0; i < n; i++ {
fmt.Fscan(reader, &grid[i])
for j := 0; j < m; j++ {
if grid[i][j] == 'S' {
sx, sy = i, j
}
}
}
visited := make([][]bool, n)
visX := make([][]int, n)
visY := make([][]int, n)
for i := 0; i < n; i++ {
visited[i] = make([]bool, m)
visX[i] = make([]int, m)
visY[i] = make([]int, m)
}
qx := make([]int, 0, n*m)
qy := make([]int, 0, n*m)
qx = append(qx, sx)
qy = append(qy, sy)
visited[sx][sy] = true
visX[sx][sy] = sx
visY[sx][sy] = sy
dx := []int{-1, 1, 0, 0}
dy := []int{0, 0, -1, 1}
head := 0
for head < len(qx) {
x := qx[head]
y := qy[head]
head++
for i := 0; i < 4; i++ {
nx := x + dx[i]
ny := y + dy[i]
mx := (nx%n + n) % n
my := (ny%m + m) % m
if grid[mx][my] == '#' {
continue
}
if visited[mx][my] {
if visX[mx][my] != nx || visY[mx][my] != ny {
fmt.Println("Yes")
return
}
} else {
visited[mx][my] = true
visX[mx][my] = nx
visY[mx][my] = ny
qx = append(qx, nx)
qy = append(qy, ny)
}
}
}
fmt.Println("No")
}
```