#include <bits/stdc++.h>
using namespace std;
int n, m;
int sx, sy;
char graph[1508][1508];
int chgx[4] = {0, 0, 1, -1};
int chgy[4] = {1, -1, 0, 0};
struct node {
  int x, y;
};
node vis[1508][1508];
bool vis2[1508][1508];
bool bfs(int x, int y) {
  node u, v;
  u.x = x;
  u.y = y;
  vis[x][y].x = x;
  vis[x][y].y = y;
  vis2[x][y] = 1;
  queue<node> que;
  que.push(u);
  int tx, ty;
  while (!que.empty()) {
    u = que.front();
    que.pop();
    x = u.x;
    y = u.y;
    for (int i = 0; i < 4; i++) {
      tx = x + chgx[i];
      ty = y + chgy[i];
      if (vis2[((tx % n) + n) % n][((ty % m) + m) % m]) {
        if (vis[((tx % n) + n) % n][((ty % m) + m) % m].x != tx ||
            vis[((tx % n) + n) % n][((ty % m) + m) % m].y != ty) {
          return true;
        } else
          continue;
      } else {
        if (graph[((tx % n) + n) % n][((ty % m) + m) % m] == '.') {
          v.x = tx;
          v.y = ty;
          vis[((tx % n) + n) % n][((ty % m) + m) % m].x = tx;
          vis[((tx % n) + n) % n][((ty % m) + m) % m].y = ty;
          vis2[((tx % n) + n) % n][((ty % m) + m) % m] = 1;
          que.push(v);
        }
      }
    }
  }
  return false;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      vis[i][j].x = 2e9;
      vis[i][j].y = 2e9;
      scanf(" %c", &graph[i][j]);
      if (graph[i][j] == 'S') {
        sx = i;
        sy = j;
        graph[i][j] = '.';
      }
    }
  }
  if (bfs(sx, sy)) {
    cout << "Yes" << endl;
  } else
    cout << "No" << endl;
  return 0;
}
