#include <stdio.h>
#define Nmax 105
#define InFile "rj.in"
#define OutFile "rj.out"
int n, m, max, imax, jmax;
int Rom[Nmax][Nmax], Jul[Nmax][Nmax];
struct punct {int x, y;} rom, jul;
void citire();
void bordare();
void lee_rom();
void lee_jul();
void determinare();
void afisare();
int main()
{
citire();
bordare();
lee_rom();
lee_jul();
determinare();
afisare();
return 0;
}
void citire()
{
int i, j;
char c;
FILE *fin=fopen (InFile, "r");
fscanf (fin, "%d %d\n", &n, &m);
for (i=1; i<=n ;i++)
{
for (j=1; j<=m; j++)
{
fscanf (fin, "%c", &c);
if (c=='X')
Rom[i][j]=Jul[i][j]=-1;
if (c=='R')
{
rom.x=i;
rom.y=j;
}
if (c=='J')
{
jul.x=i;
jul.y=j;
}
}
fscanf (fin, "%c", &c);
}
fclose (fin);
}
void bordare()
{
int i;
for (i=0; i<=m+1; i++)
Rom[0][i]=Jul[0][i]=Rom[n+1][i]=Jul[n+1][i]=-1;
for (i=0; i<=n+1; i++)
Rom[i][0]=Rom[i][m+1]=Jul[i][0]=Jul[i][m+1]=-1;
}
void lee_rom()
{
int i;
punct x, y;
punct C[Nmax*Nmax];
int inc=-1, sf=-1;
int dl[]={-1, -1, 0, 1, 1, 1, 0, -1}, dc[]={0, 1, 1, 1, 0, -1, -1, -1};
//initializez coada
sf++;
C[sf]=rom;
while (inc<sf)
{
//scot un element din coada
inc++; x=C[inc];
for (i=0; i<8; i++)
{
y.x=x.x+dl[i]; y.y=x.y+dc[i];
if (Rom[y.x][y.y]==0&&(y.x!=rom.x||y.y!=rom.y))
{
sf++;
C[sf]=y;
Rom[y.x][y.y]=Rom[x.x][x.y]+1;
}
}
}
}
void lee_jul()
{
int i;
punct x, y;
punct C[Nmax*Nmax];
int inc=-1, sf=-1;
int dl[]={-1, -1, 0, 1, 1, 1, 0, -1}, dc[]={0, 1, 1, 1, 0, -1, -1, -1};
//initializez coada
sf++;
C[sf]=jul;
while (inc<sf)
{
//scot un element din coada
inc++; x=C[inc];
for (i=0; i<8; i++)
{
y.x=x.x+dl[i]; y.y=x.y+dc[i];
if (Jul[y.x][y.y]==0&&(y.x!=jul.x||y.y!=jul.y))
{
sf++;
C[sf]=y;
Jul[y.x][y.y]=Jul[x.x][x.y]+1;
}
}
}
}
void determinare()
{
int i, j;
max=Nmax*Nmax;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
if (Rom[i][j]==Jul[i][j]&&Rom[i][j]!=-1&&Rom[i][j]!=0&&Rom[i][j]<max-1)
{
max=Rom[i][j]+1;
imax=i;
jmax=j;
}
}
void afisare()
{
FILE *fout=fopen (OutFile, "w");
fprintf (fout, "%d %d %d\n", max, imax, jmax);
fclose (fout);
}