#include <cstdio>
#include <queue>
#include <algorithm>
#define IN "rj.in"
#define OUT "rj.out"
#define NRMAX 105
#define INF (1<<7)-1
using namespace std;
char a[NRMAX][NRMAX],b[NRMAX][NRMAX];
pair<char, char> pozi,pozf,aux,auxi;
queue< pair<char,char> > coada;
static const int dx[]= {-1,0,1,0,-1,1,1,-1},dy[]= {0,1,0,-1,1,1,-1,-1};
char n,m,pozx,pozy,mini=INF;
void bordare(void);
void drumbun(void);
inline bool inauntru(pair <char,char>a)
{
return a.first>0&&a.first<=n&&a.second>0&&a.second<=m;
}
int main()
{
FILE *in=fopen(IN,"r"),*out=fopen(OUT,"w");
char i,j,c;
fscanf(in,"%d%d",&n,&m);
for(i=1; i<=n; ++i)
{
for(j=1; j<=m; ++j)
{
fscanf(in,"%c",&c);
if(c=='R') pozi=make_pair(i,j),a[i][j]=1;
else if(c=='J') pozf=make_pair(i,j),b[i][j]=1;
else if(c=='X') a[i][j]=b[i][j]=2;
}
}
fclose(in);
coada.push(pozi);
while(!coada.empty())
{
aux=coada.front();
coada.pop();
for(i=0; i<8; ++i)
{
auxi=make_pair(aux.first+dx[i],aux.second+dy[i]);
if(!a[auxi.first][auxi.second]&&inauntru(auxi))
{
a[auxi.first][auxi.second]=a[aux.first][aux.second]+1;
coada.push(auxi);
}
}
}
coada.push(pozf);
while(!coada.empty())
{
aux=coada.front();
coada.pop();
for(i=0; i<8; ++i)
{
auxi=make_pair(aux.first+dx[i],aux.second+dy[i]);
if(!b[auxi.first][auxi.second]&&inauntru(auxi))
{
b[auxi.first][auxi.second]=b[aux.first][aux.second]+1;
coada.push(auxi);
}
}
}
drumbun();
fprintf(out,"%d %d %d\n",mini,pozx,pozy);
fclose(out);
return 0;
}
void drumbun(void)
{
int i,j;
for(i=1; i<=n; ++i)
{
for(j=1; j<=m; ++j)
{
if(a[i][j]==b[i][j]&&a[i][j]<mini&&a[i][j]&&a[i][j]!=2)
{
mini=a[i][j];
pozx=i;
pozy=j;
}
}
}
}