#include<stdio.h>
int a[100][100], b[100][100], xj, yj, xr, yr, m, n;
int dx[8]={1,1,0,-1,-1,-1,0,1}, dy[8]={0,1,1,1,0,-1,-1,-1};
typedef struct
{
int x,y;
} Coada;
Coada C[10000];
char c;
void citire()
{
freopen("rj.in","r",stdin);
freopen("rj.out","w",stdout);
int i, j;
scanf("%d %d",&n,&m);
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
{
scanf ("%c",&c);
if (c=='X') a[i][j]=b[i][j]=-1;
if (c==' ') a[i][j]=b[i][j]=0;
if (c=='J') {a[i][j]=b[i][j]=1; xj=i; yj=j;}
if (c=='R') {a[i][j]=b[i][j]=1; xr=i; yr=j;}
}
for (i=0; i<=n+1; i++) a[i][0]=b[i][0]=a[i][m+1]=b[i][m+1]=-2;
for (i=0; i<=m+1; i++) a[0][i]=b[0][i]=a[n+1][i]=b[n+1][i]=-2;
}
void parcurs(int x, int y, int a[100][100])
{
int xn,yn,p, u, i;
p=u=1;
C[p].x=x;
C[p].y=y;
while (p<=u)
{
for(i=0; i<8; i++)
{
xn=x+dx[i];
yn=y+dy[i];
if (a[xn][yn]==0)
{
C[++u].x=xn; C[++u].y=yn;
a[xn][yn]=a[x][y]+1;
}
}
p++;
}
}
void verif()
{
int minim=1000, i, j;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
if (a[i][j]==b[i][j]) if (a[i][j]<minim) minim=a[i][j];
printf("%d",minim);
}
int main()
{
citire();
parcurs(xj,yj,a);
parcurs(xr,yr,b);
verif();
return 0;
}