#include<bits/stdc++.h>
using namespace std;
const int maxN = 4000;
const int inf = 1e9+83;
char meadow[maxN][maxN];
int bicho[maxN][maxN];
vector<int> graph[maxN*maxN+1];
int dis[maxN*maxN+1];
int w, h;
void bfs(int x, int y){
queue<pair<int,int>> tv;
tv.push({x,y});
int n = bicho[x][y];
char esto = meadow[x][y];
char otro = 'R'+'F'-esto;
vector<bool> con(n+1, 0);
con[n] = true;
while(!tv.empty()){
x = tv.front().first;
y = tv.front().second;
tv.pop();
// Exploring other parts of the component
if(x > 0 && meadow[x-1][y] == esto && bicho[x-1][y] == -1){
bicho[x-1][y] = bicho[x][y];
tv.push({x-1,y});
}
if(x < w-1 && meadow[x+1][y] == esto && bicho[x+1][y] == -1){
bicho[x+1][y] = bicho[x][y];
tv.push({x+1,y});
}
if(y > 0 && meadow[x][y-1] == esto && bicho[x][y-1] == -1){
bicho[x][y-1] = bicho[x][y];
tv.push({x,y-1});
}
if(y < h-1 && meadow[x][y+1] == esto && bicho[x][y+1] == -1){
bicho[x][y+1] = bicho[x][y];
tv.push({x,y+1});
}
// Joining the components
if(x > 0 && meadow[x-1][y] == otro && bicho[x-1][y] != -1){
if(!con[bicho[x-1][y]]) {
con[bicho[x-1][y]] = true;
graph[n].push_back(bicho[x-1][y]);
graph[bicho[x-1][y]].push_back(n);
}
}
if(x < w-1 && meadow[x+1][y] == otro && bicho[x+1][y] != -1){
if(!con[bicho[x+1][y]]) {
con[bicho[x+1][y]] = true;
graph[n].push_back(bicho[x+1][y]);
graph[bicho[x+1][y]].push_back(n);
}
}
if(y > 0 && meadow[x][y-1] == otro && bicho[x][y-1] != -1){
if(!con[bicho[x][y-1]]) {
con[bicho[x][y-1]] = true;
graph[n].push_back(bicho[x][y-1]);
graph[bicho[x][y-1]].push_back(n);
}
}
if(y < h-1 && meadow[x][y+1] == otro && bicho[x][y+1] != -1){
if(!con[bicho[x][y+1]]) {
con[bicho[x][y+1]] = true;
graph[n].push_back(bicho[x][y+1]);
graph[bicho[x][y+1]].push_back(n);
}
}
}
}
int bfs2(int node) {
queue<int> tv;
tv.push(node);
dis[node] = 1;
int mx = 1;
while(!tv.empty()){
node = tv.front();
tv.pop();
for(int u : graph[node]){
if(dis[u] == -1){
tv.push(u);
dis[u] = dis[node]+1;
mx = max(dis[u], mx);
}
}
}
return mx;
}
int main(){
cin >> w >> h;
int cnt = 0;
memset(meadow, 0, sizeof(meadow));
memset(bicho, -1, sizeof(bicho));
memset(dis, -1, sizeof(dis));
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
cin >> meadow[i][j];
}
}
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
if(bicho[i][j] == -1 && meadow[i][j] != '.'){
bicho[i][j] = cnt++;
bfs(i, j);
}
}
}
/*
cout << '\n';
for(int i = 0; i < w; ++i){
for(int j = 0; j < h; ++j){
if(bicho[i][j] == -1) cout << '.';
else cout << bicho[i][j];
}cout << '\n';
} cout << '\n';
for(int i = 0; i < cnt; ++i){
cout << i << ": ";
for(int u : graph[i]) cout << u << ' ';
cout << '\n';
}
*/
int mx = bfs2(0);
cout << mx << '\n';
return 0;
}