#include <fstream>
#define DMAX 105
using namespace std;
ifstream fin("rj.in");
ofstream fout("rj.out");
int Ro[DMAX][DMAX];
int Ju[DMAX][DMAX];
int dl[]= {-1,-1,0,1,1,1,0,-1};
int dc[]= {0,1,1,1,0,-1,-1,-1};
struct pozitie
{
int x, y;
};
pozitie C[DMAX*DMAX];
void citire(int &lin1, int &lin2, int &col1, int &col2);
void bordare(int L[DMAX][DMAX]);
void lee(int lin, int col, int L[DMAX][DMAX]);
void cautare(int &poz1, int&poz2);
int mini=10300,i,j,lin1,col1,lin2,col2,n,m;
int main()
{
citire(lin1,lin2,col1,col2);
bordare(Ro);
bordare(Ju);
lee(lin1,col1,Ro);
lee(lin2,col2,Ju);
cautare(i,j);
fout<<mini<<' '<<i<<' '<<j<<'\n';
fin.close();
fout.close();
return 0;
}
void citire(int &lin1, int &lin2, int &col1, int &col2)
{
char x;
int i,j;
fin>>n>>m;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
fin.get(x);
if(x=='X')
{
Ro[i][j]=-1;
Ju[i][j]=-1;
}
else
if(x==' ' || x=='R' || x=='J')
{
if(x=='R')
{
Ro[i][j]=1;
lin1=i;
col1=j;
}
else
if(x=='J')
{
Ju[i][j]=1;
lin2=i;
col2=j;
}
}
}
while(x!='\n')
fin.get(x);
}
}
void bordare(int L[DMAX][DMAX])
{
int i;
for(i=0; i<=m+1; i++)
L[0][i]=L[n+1][i]=-1;
for(i=0; i<=n+1; i++)
L[i][0]=L[i][m+1]=-1;
}
void lee(int lin, int col, int L[DMAX][DMAX])
{
int i,k,prim,ultim,nx,ny,vx,vy;
for(i=1; i<DMAX*DMAX; i++)
{
C[i].x=0;
C[i].y=0;
}
C[0].x=lin;
C[0].y=col;
prim=ultim=0;
while(prim<=ultim)
{
nx=C[prim].x;
ny=C[prim].y;
prim++;
for(k=0; k<8; k++)
{
vx=nx+dl[k];
vy=ny+dc[k];
if(L[vx][vy]==0)
{
L[vx][vy]=L[nx][ny]+1;
C[++ultim].x=vx;
C[ultim].y=vy;
}
}
}
}
void cautare(int &poz1, int&poz2)
{
int i,j;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(Ro[i][j]==Ju[i][j] && Ro[i][j]!=-1 && Ro[i][j]!=0)
{
if(Ro[i][j]<mini)
{
poz1=i;
poz2=j;
mini=Ro[i][j];
}
}
}