#include <bits/stdc++.h>
using namespace std;
bool store[1501][1501];
bool reachable[1501][1501];
int recordx[1501][1501];
int recordy[1501][1501];
int startx, starty;
bool flood_fill(int n, int m, int x, int y) {
  if (!store[((x % n) < 0 ? (x % n) + n : (x % n))]
            [((y % m) < 0 ? (y % m) + m : (y % m))])
    return false;
  if (reachable[((x % n) < 0 ? (x % n) + n : (x % n))]
               [((y % m) < 0 ? (y % m) + m : (y % m))]) {
    if (x != recordx[((x % n) < 0 ? (x % n) + n : (x % n))]
                    [((y % m) < 0 ? (y % m) + m : (y % m))] ||
        y != recordy[((x % n) < 0 ? (x % n) + n : (x % n))]
                    [((y % m) < 0 ? (y % m) + m : (y % m))]) {
      return true;
    } else
      return false;
  }
  reachable[((x % n) < 0 ? (x % n) + n : (x % n))]
           [((y % m) < 0 ? (y % m) + m : (y % m))] = true;
  recordx[((x % n) < 0 ? (x % n) + n : (x % n))]
         [((y % m) < 0 ? (y % m) + m : (y % m))] = x;
  recordy[((x % n) < 0 ? (x % n) + n : (x % n))]
         [((y % m) < 0 ? (y % m) + m : (y % m))] = y;
  if (flood_fill(n, m, x - 1, y)) return true;
  if (flood_fill(n, m, x + 1, y)) return true;
  if (flood_fill(n, m, x, y - 1)) return true;
  if (flood_fill(n, m, x, y + 1)) return true;
  return false;
}
int main() {
  stringstream ss;
  string s;
  memset(store, false, sizeof(store));
  memset(reachable, false, sizeof(reachable));
  int n, m;
  getline(cin, s);
  ss << s;
  ss >> n >> m;
  ss.str("");
  ss.clear();
  for (int i = 0; i < n; ++i) {
    getline(cin, s);
    ss << s;
    for (int j = 0; j < m; ++j) {
      char ch;
      ss >> ch;
      if (ch == '.') {
        store[i][j] = true;
      }
      if (ch == 'S') {
        store[i][j] = true;
        startx = i;
        starty = j;
      }
    }
    ss.clear();
  }
  if (flood_fill(n, m, startx, starty)) {
    cout << "Yes";
  } else {
    cout << "No";
  }
}
