#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
#define nmax 101
int R[nmax][nmax],J[nmax][nmax],n,m,xR,yR,xJ,yJ;
queue <pair<int , int> > QR,QJ;
const int dx[]={-1,-1,0,1,1,1,0,-1};
const int dy[]={0,1,1,1,0,-1,-1,-1};
ofstream g("rj.out");
void citire()
{
ifstream f("rj.in");
char x[nmax];
f>>n>>m;
f.get();
for(int i=1;i<=n;i++)
{
f.getline(x,nmax,'\n');
for(int j=0;j<m;j++)
{
if(x[j]=='R')
{
xR=i;
yR=j+1;
}
else
if(x[j]=='X')
R[i][j+1]=J[i][j+1]=-1;
else
if(x[j]=='J')
{
xJ=i;
yJ=j+1;
}
}
}
f.close();
}
bool OK(int i, int j,int a[][nmax] )
{
if( i<1 || i>n || j<1 || j>m)
return false;
if(a[i][j]!=0)
return false;
return true;
}
void lee(int x,int y,queue <pair <int ,int > > Q, int a[][nmax])
{
int xx,yy;
a[x][y]=1;
Q.push(make_pair(x,y));
while(!Q.empty())
{
x=Q.front().first;
y=Q.front().second;
Q.pop();
for(int i=0;i<8;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if(OK(xx,yy,a))
{
a[xx][yy]=a[x][y]+1;
Q.push(make_pair(xx,yy));
}
}
}
}
void afisare(int X[][nmax])
{
g<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
g<<X[i][j]<<" ";
g<<endl;
}
g<<endl;
}
int main()
{
citire();
lee(xR,yR,QR,R);
lee(xJ,yJ,QJ,J);
int tmin=10000,pi,pj;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(R[i][j]==J[i][j]&&R[i][j]!=-1&&R[i][j]!=0)
if(tmin>R[i][j])
{
tmin=R[i][j];
pi=i;
pj=j;
}
}
g<<tmin<<" "<<pi<<" "<<pj;
g.close();
return 0;
}