#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));
deque<pair<int, int>> dq;
dq.push_front({0, 0});
visited[0][0]=0;
int ans=0;
while(!dq.empty()){
int x=dq.front().first;
int y=dq.front().second;
dq.pop_front();
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];
dq.push_front({newx, newy});
}else{
visited[newx][newy]=visited[x][y]+1;
ans=max(ans, visited[newx][newy]);
dq.push_back({newx, newy});
}
}
}
cout << ans+1 << endl;
}