type ref=^nod;
nod=record
x,y:byte;
adr:ref;
end;
var a:array[0..101,0..101] of byte;
d,d2:array[1..100,1..100] of integer;
c1,c2,sf1,sf2,u:ref;
m,n,i,j,t,a3,b,a2,b2:word;
c:char;
f,g:text;
k:boolean;
procedure addr(x,y:byte);
begin
if (x>0) and (x<=m) and (y>0) and (y<=n) and (a[x,y]=0) and (d[x,y]=0) and not ((x=a3) and (y=b)) then
begin
d[x,y]:=t;
new(u);
u^.x:=x;
u^.y:=y;
u^.adr:=nil;
sf1^.adr:=u;
sf1:=u;
end;
end;
procedure addj(x,y:byte);
begin
if (x>0) and (x<=m) and (y>0) and (y<=n) and (a[x,y]=0) and (d2[x,y]=0) and not ((x=a2) and (y=b2)) then
begin
if d[x,y]=t then
k:=true;
d2[x,y]:=t;
new(u);
u^.x:=x;
u^.y:=y;
sf2^.adr:=u;
sf2:=u;
end;
end;
begin
assign(f,'rj.in');
assign(g,'rj.out');
reset(f);rewrite(g);
readln(f,m,n);
for i:=1 to m do
begin
for j:=1 to n do
begin
read(f,c);
case c of
'X':a[i,j]:=1;
'R':begin
a[i,j]:=2;
new(c1);
c1^.x:=i;
c1^.y:=j;
a3:=i;
b:=j;
c1^.adr:=nil;
sf1:=c1;
end;
'J':begin
a[i,j]:=3;
new(c2);
c2^.x:=i;
c2^.y:=j;
a2:=i;
b2:=j;
c2^.adr:=nil;
sf2:=c2;
end;
end;
end;
readln(f);
end;
t:=1;
repeat
inc(t);
repeat
addr(c1^.x-1,c1^.y);
addr(c1^.x,c1^.y-1);
addr(c1^.x,c1^.y+1);
addr(c1^.x+1,c1^.y);
addr(c1^.x-1,c1^.y-1);
addr(c1^.x-1,c1^.y+1);
addr(c1^.x+1,c1^.y-1);
addr(c1^.x+1,c1^.y+1);
u:=c1;
c1:=c1^.adr;
dispose(u);
until d[c1^.x,c1^.y]>t-1;
repeat
addj(c2^.x-1,c2^.y);if k=true then break;
addj(c2^.x,c2^.y-1);if k=true then break;
addj(c2^.x,c2^.y+1);if k=true then break;
addj(c2^.x+1,c2^.y);if k=true then break;
addj(c2^.x-1,c2^.y-1);if k=true then break;
addj(c2^.x-1,c2^.y+1);if k=true then break;
addj(c2^.x+1,c2^.y-1);if k=true then break;
addj(c2^.x+1,c2^.y+1);if k=true then break;
u:=c2;
c2:=c2^.adr;
dispose(u);
until d2[c2^.x,c2^.y]>t-1;
until k=true;
write(g,t,' ',sf2^.x,' ',sf2^.y);
close(f);close(g);
end.