#include <bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int N, M;
cin >> N >> M;
vector<vector<int>> grid(N, vector<int>(M));
for(int i=0; i<N; i++){
string s;
cin >> s;
for(int j=0; j<M; j++){
if(s[j]=='.'){
grid[i][j]=0;
}
if(s[j]=='R'){
grid[i][j]=1;
}
if(s[j]=='F'){
grid[i][j]=2;
}
// cout << grid[i][j] << " ";
}
// cout << endl;
}
// rabbit is 1, fox is 2
int xadj[]={1, 0, -1, 0};
int yadj[]={0, 1, 0, -1};
vector<vector<int>> visited(N, vector<int>(M, -1));
queue<pair<int, int>> q1;
queue<pair<int, int>> q2;
q1.push({0, 0});
visited[0][0]=1;
int maxdist=1;
while (!q1.empty()) {
while(!q1.empty()){
int x=q1.front().first;
int y=q1.front().second;
q1.pop();
for(int k=0; k<4; k++){
int newx=x+xadj[k];
int newy=y+yadj[k];
if((newx<0 || newx>=N || newy<0 || newy>=M)||visited[newx][newy]!=-1||grid[newx][newy]==0){
continue;
}
if (grid[x][y]==grid[newx][newy]) {
visited[newx][newy]=visited[x][y];
q1.push({newx, newy});
}
else {
visited[newx][newy]=visited[x][y]+1;
q2.push({newx, newy});
}
maxdist=max(maxdist,visited[newx][newy]);
}
}
while(!q2.empty()){
int x=q2.front().first;
int y=q2.front().second;
q2.pop();
for(int k=0; k<4; k++){
int newx=x+xadj[k];
int newy=y+yadj[k];
if((newx<0 || newx>=N || newy<0 || newy>=M)||visited[newx][newy]!=-1||grid[newx][newy]==0){
continue;
}
if (grid[x][y]==grid[newx][newy]) {
visited[newx][newy]=visited[x][y];
q2.push({newx, newy});
}
else {
visited[newx][newy]=visited[x][y]+1;
q1.push({newx, newy});
}
maxdist=max(maxdist,visited[newx][newy]);
}
}
}
cout << maxdist << endl;
}