#include <bits/stdc++.h>
using namespace std;
ifstream f("rj.in");
ofstream g("rj.out");
#define NMax 12000
int dx[8]={0, 1, 0, -1, -1, 1, -1, 1};
int dy[8]={1, 0, -1, 0, -1, 1, 1,-1};
long long n,m,xi,yi,xf,yf,xr,yr,xj,yj;
int ju[1005][1005],r[1005][1005];
char c;
queue <int> Q;
void BordareR(int n, int m){
for (int i=0;i<=m+1;i++)
r[0][i]=r[n+1][i]=-1;
for (int i=0;i<=n+1;i++)
r[i][0]=r[i][m+1]=-1;
}
void BordareJ(int n, int m){
for (int i=0;i<=m+1;i++)
ju[0][i]=ju[n+1][i]=-1;
for (int i=0;i<=n+1;i++)
ju[i][0]=ju[i][m+1]=-1;
}
static inline void Lee1(int xi, int yi){
queue<pair<int,int>> Q;
int x,y,xx,yy;
Q.push(make_pair(xi,yi));
r[xi][yi]=1;
while (!Q.empty()){
x=Q.front().first;
y=Q.front().second;
for (int i=0;i<8;i++){
xx=x+dx[i];
yy=y+dy[i];
if (r[xx][yy]==0){
Q.push(make_pair(xx,yy));
r[xx][yy]=r[x][y]+1;
}
}
Q.pop();
}
}
static inline void Lee2(int xi, int yi){
queue<pair<int,int>> Q;
int x,y,xx,yy;
Q.push(make_pair(xi,yi));
ju[xi][yi]=1;
while (!Q.empty()){
x=Q.front().first;
y=Q.front().second;
for (int i=0;i<8;i++){
xx=x+dx[i];
yy=y+dy[i];
if (ju[xx][yy]==0){
Q.push(make_pair(xx,yy));
ju[xx][yy]=ju[x][y]+1;
}
}
Q.pop();
}
}
void afisare(){
int t_minim = NMax;
int Minx=-1, Miny=-1;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (r[i][j]==ju[i][j] && r[i][j]<t_minim && r[i][j]!=0 && r[i][j]!=-1){
t_minim=r[i][j];
Minx=i;
Miny=j;
}
}
}
g<<t_minim<<" "<<Minx<<" "<<Miny<<'\n';
}
int main()
{
// ios_base :: sync_with_stdio(false);
// cin.tie(nullptr);
// f.tie(0);
f>>n>>m;
f.get();
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
f.get(c);
if (c=='X'){
r[i][j]=ju[i][j]=-1;
}
if (c=='R'){
xr=i;
yr=j;
r[i][j]=ju[i][j]=0;
}
if (c=='J'){
xj=i;
yj=j;
r[i][j]=ju[i][j]=0;
}
if (c==' '){
r[i][j]=ju[i][j]=0;
}
}
f.get();
}
BordareR(n,m);
BordareJ(n,m);
Lee1(xr,yr);
Lee2(xj,yj);
/*
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
g<<r[i][j]<<" ";
}
g<<'\n';
}
*/
afisare();
return 0;
}