#include <bits/stdc++.h>
using namespace std;
struct pkt {
  int x, y;
};
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
const int INF = 1000000000;
int Modulo(int x, int m) {
  if (x >= 0) return x % m;
  int abs = -x;
  int r = abs % m;
  return (r != 0) ? m - r : 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  int n, m;
  cin >> n >> m;
  vector<string> P(n);
  for (int i = 0; i < n; ++i) cin >> P[i];
  pkt start;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j)
      if (P[i][j] == 'S') start = {i, j};
  stack<pkt> S;
  vector<vector<pkt> > odw(n);
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < m; ++j) odw[i].push_back({INF, INF});
  pkt akt;
  odw[start.x][start.y] = start;
  S.push(start);
  bool odp = false;
  while (!S.empty()) {
    akt = S.top();
    S.pop();
    for (int i = 0; i < 4; ++i) {
      pkt nowy = {akt.x + dx[i], akt.y + dy[i]};
      pkt nowy_m = {Modulo(nowy.x, n), Modulo(nowy.y, m)};
      if (P[nowy_m.x][nowy_m.y] == '#') continue;
      if (odw[nowy_m.x][nowy_m.y].x != INF &&
          (odw[nowy_m.x][nowy_m.y].x != nowy.x ||
           odw[nowy_m.x][nowy_m.y].y != nowy.y))
        odp = true;
      else {
        if (odw[nowy_m.x][nowy_m.y].x == INF) {
          odw[nowy_m.x][nowy_m.y] = nowy;
          S.push(nowy);
        }
      }
    }
  }
  if (odp)
    cout << "Yes";
  else
    cout << "No";
  return 0;
}
