#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin ("rj.in");
ofstream fout ("rj.out");
int n, m, i1, j1, i2, j2, mn = 0x3f, i_min, j_min, a[101][101], viz[101][101],
d[8][2] = {{-1, 0}, {0, -1}, {1, 0}, {0, 1}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
struct coord {
int r, j;
};
coord val[101][101];
struct q_entry {
int i, j, index;
};
queue<q_entry> q;
int on_map(int i, int j)
{
return (1 <= i && i <= n && 1 <= j && j <= m);
}
void lee(int istart, int jstart, char ch)
{
memset(viz, 0, sizeof(viz));
if (ch == 'R') val[istart][jstart].r = 1;
if (ch == 'J') val[istart][jstart].j = 1;
q.push({istart, jstart, 2});
while (!q.empty())
{
q_entry c = q.front();
q.pop();
for (int k = 0; k < 8; k++)
{
int xx = c.i + d[k][0], yy = c.j + d[k][1];
if (!on_map(xx, yy)) continue;
if (a[xx][yy] == 1) continue;
if (viz[xx][yy]) continue;
viz[xx][yy] = 1;
if (ch == 'R') val[xx][yy].r = c.index;
if (ch == 'J') val[xx][yy].j = c.index;
q.push({xx, yy, c.index + 1});
}
}
}
int main()
{
fin >> n >> m;
fin.get();
for (int i = 1; i <= n; i++)
{
char c[102];
fin.getline(c, 101);
for (int j = 0; j < m; j++)
{
if (c[j] == 'X') a[i][j+1] = 1;
else if (c[j] == 'R') {
i1 = i; j1 = j+1;
}
else if (c[j] == 'J') {
i2 = i; j2 = j+1;
}
}
}
lee(i1, j1, 'R');
lee(i2, j2, 'J');
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (val[i][j].r == val[i][j].j && val[i][j].r != 0)
{
if (mn > val[i][j].r)
{
mn = val[i][j].r;
i_min = i;
j_min = j;
}
}
}
}
fout << mn << " " << i_min << " " << j_min;
return 0;
}