#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 20;
int H, W;
void DP(vector<vector<char>> S, int h, int w, int count, int *min, int *flag) {
  if (*flag == 1) return;
  if (S[h][w] == 'G') {
    *min = count;
    *flag = 1;
    return;
  } else {
    S[h][w] = '#';
    if (h > 0 && S[h - 1][w] != '#') DP(S, h - 1, w, count + 1, min, flag);
    if (h < H - 1 && S[h + 1][w] != '#') DP(S, h + 1, w, count + 1, min, flag);
    if (w > 0 && S[h][w - 1] != '#') DP(S, h, w - 1, count + 1, min, flag);
    if (w < W - 1 && S[h][w + 1] != '#') DP(S, h, w + 1, count + 1, min, flag);
  }
}
int main() {
  cin >> H >> W;
  vector<vector<char>> S(H, vector<char>(W));
  for (int i = 0; i < H; i++) {
    for (int j = 0; j < W; j++) cin >> S[i][j];
  }
  int ans = 0;
  for (int i = 0; i < H * W; i++) {
    for (int j = i + 1; j < H * W; j++) {
      if ((S[i / W][i % W] != '#') && (S[j / W][j % W] != '#')) {
        char tmp = S[j / W][j % W];
        S[j / W][j % W] = 'G';
        int min = INF;
        int flag = 0;
        DP(S, i / W, i % W, 0, &min, &flag);
        S[j / W][j % W] = tmp;
        if (ans < min) ans = min;
      }
    }
  }
  cout << ans;
}
