//Autor Simoiu Robert 100 pct.
#include <fstream>
using namespace std;
#define MAX 100000
#define M 105
#define oo 0x3f3f3f3f
int n,m,i,j,k,l,q1=1,q2=1,ct[M][M],cy[M][M],xx,yy,minim;
bool stop;
char s[M];
ifstream f("rj.in");
ofstream g("rj.out");
struct vector1
{
int st,dr;
} q[MAX],Q[MAX];
void citire()
{
f>>n>>m;f.getline(s,2);
for (i=1;i<=n;i++){
f.getline(s,110);
for (j=0;j<m;j++)
{
if (s[j]=='X') ct[i][j+1]=-2,cy[i][j+1]=-2;
else if (s[j]=='J') ct[i][j+1]=-1;
else if (s[j]=='R') cy[i][j+1]=-1;
else ct[i][j+1]=0,cy[i][j+1]=0;
if (ct[i][j+1]==-1)
{
q[0].st=i;
q[0].dr=j+1;
}
else if (cy[i][j+1]==-1)
{
Q[0].st=i;
Q[0].dr=j+1;
}
}}
}
inline void dreapta(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i;
q[q1++].dr=j+1;
ct[i][j+1]=k+1;
}
inline void stanga(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i;
q[q1++].dr=j-1;
ct[i][j-1]=k+1;
}
inline void sus(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i-1;
q[q1++].dr=j;
ct[i-1][j]=k+1;
}
inline void jos(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i+1;
q[q1++].dr=j;
ct[i+1][j]=k+1;
}
inline void susdreapta(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i-1;
q[q1++].dr=j+1;
ct[i-1][j+1]=k+1;
}
inline void susstanga(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i-1;
q[q1++].dr=j-1;
ct[i-1][j-1]=k+1;
}
inline void josdreapta(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i+1;
q[q1++].dr=j+1;
ct[i+1][j+1]=k+1;
}
inline void josstanga(int ct[][M],vector1 q[],int &q1)
{
q[q1].st=i+1;
q[q1++].dr=j-1;
ct[i+1][j-1]=k+1;
}
inline void verf(int ct[][M],vector1 q[],int &q1)
{
if ((ct[i][j+1]==0) && !(j==m) )
dreapta(ct,q,q1);
if ((ct[i][j-1]==0) && !(j==1) )
stanga(ct,q,q1);
if ((ct[i-1][j]==0) && !(i==1) )
sus(ct,q,q1);
if ((ct[i+1][j]==0) && !(i==n) )
jos(ct,q,q1);
if ((ct[i-1][j-1]==0) && !(i==1 || j==1) )
susstanga(ct,q,q1);
if ((ct[i-1][j+1]==0) && !(i==1 || j==m) )
susdreapta(ct,q,q1);
if ((ct[i+1][j-1]==0) && !(i==n || j==1) )
josstanga(ct,q,q1);
if ((ct[i+1][j+1]==0) && !(i==n || j==m) )
josdreapta(ct,q,q1);
}
inline void solve(int ct[][M],vector1 q[],int q1)
{
stop=0;k=1;
for (l=0;!stop;l++)
{
i=q[l].st;
j=q[l].dr;
if (i==0) stop=1;
else {
verf(ct,q,q1);
if (!((ct[q[l].st][q[l].dr]==ct[q[l+1].st][q[l+1].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+2].st][q[l+2].dr])
|| (ct[q[l].st][q[l].dr]==ct[q[l+3].st][q[l+3].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+4].st][q[l+4].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+5].st][q[l+5].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+6].st][q[l+6].dr])
|| (ct[q[l].st][q[l].dr]==ct[q[l+7].st][q[l+7].dr]) || (ct[q[l].st][q[l].dr]==ct[q[l+8].st][q[l+8].dr]) ) && (!stop))
k++;}
}
}
void scriere()
{
minim=xx=yy=oo;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (ct[i][j]==cy[i][j] && ct[i][j]<=minim && ct[i][j]>0)
if (ct[i][j]==minim) {if (xx>i || xx==i && yy>j) xx=i,yy=j;}
else minim=ct[i][j],xx=i,yy=j;
g<<minim<<xx<<yy;
/* for (i=1;i<=n;i++){
for (j=1;j<=m;j++)
fprintf(g,"%d ",ct[i][j]);fprintf(g,"\n");}*/
}
int main()
{
citire();
solve(cy,Q,q2);
solve(ct,q,q1);
scriere();
return 0;
}