← Home
```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")
}
```