#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
vector<int> xadj={1, 0, -1, 0};
vector<int> yadj={0, 1, 0, -1};
vector<vector<int>> visited(N, vector<int>(M, -1));
int cnt=0;
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
if(visited[i][j]==-1 && grid[i][j]!=0){
queue<pair<int, int>> q;
q.push({i, j});
visited[i][j]=cnt;
int c=grid[i][j];
while(!q.empty()){
int x=q.front().first;
int y=q.front().second;
q.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]!=c){
continue;
}
visited[newx][newy]=cnt;
q.push({newx, newy});
}
}
cnt++;
}
}
}
// cout << endl;
// for(int i=0; i<N; i++){
// for(int j=0; j<M; j++){
// cout << visited[i][j] << " ";
// }
// cout << endl;
// }
vector<set<int>> adj(cnt, set<int>());
for(int i=0; i<N; i++){
for(int j=0; j<M; j++){
for(int k=0; k<4; k++){
if (visited[i][j] == -1) continue;
int newx=i+xadj[k];
int newy=j+yadj[k];
if((newx<0 || newx>=N || newy<0 || newy>=M)||visited[newx][newy]==-1){
continue;
}
adj[visited[i][j]].insert(visited[newx][newy]);
adj[visited[newx][newy]].insert(visited[i][j]);
}
}
}
//shortest from 0 to any
vector<int> visited2(cnt, -1);
queue<int> bfs;
bfs.push(0);
visited2[0]=1;
while(!bfs.empty()){
int temp=bfs.front();
bfs.pop();
for(int v:adj[temp]){
if(v==temp) continue;
if(visited2[v]==-1){
bfs.push(v);
visited2[v]=visited2[temp]+1;
}
}
}
int ans=-1;
for(int i=0; i<cnt; i++){
ans=max(ans, visited2[i]);
}
cout << ans << endl;
}