#include <stdio.h>
#include <string.h>
#define NMAX 105
typedef struct coada
{
int x, y;
};
char a[NMAX][NMAX];
int n, m;
int ri, rj, ji, jj;
int r[NMAX][NMAX];
int j[NMAX][NMAX];
void read()
{
int i, j;
scanf("%d %d\n", &n, &m);
for(i = 1; i <= n; ++i)
{
fgets(a[i]+1, NMAX, stdin);
for(j = 1; j <= m; ++j)
{
if(a[i][j] == 'R')
ri = i, rj = j;
else if(a[i][j] == 'J')
ji = i, jj = j;
}
}
}
void parcurgere(int bi, int bj, int m[NMAX][NMAX])
{
coada c[10000];
int inc, sf;
int x, y, j;
int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
memset(m, 0, sizeof(m));
inc = sf = 0;
c[0].x = bi;
c[0].y = bj;
m[bi][bj] = 1;
while(inc <= sf)
{
x = c[inc].x;
y = c[inc++].y;
for(j = 0; j < 8; ++j)
{
if((a[ x+dx[j] ][ y+dy[j] ] == ' ') && (m[ x+dx[j] ][ y+dy[j] ] == 0) )
{
c[++sf].x = x+dx[j];
c[sf].y = y+dy[j];
m[ x+dx[j] ][ y+dy[j] ] = m[x][y] + 1;
}
}
}
}
void bordare()
{
int i;
for(i = 0; i <= n+1; ++i)
a[i][0] = a[i][m+1] = 'X';
for(i = 0; i <= m+1; ++i)
a[0][i] = a[n+1][i] = 'X';
}
void write()
{
int i, k;
int tmin = 32000, x, y;
for(i = 1; i <= n; ++i)
{
for(k = 1; k <= m; ++k)
if((r[i][k] != 0) && (r[i][k] == j[i][k]))
if(tmin > r[i][k])
{
tmin = r[i][k];
x = i;
y = k;
}
}
printf("%d %d %d\n", tmin, x, y);
}
void print_m(int p[NMAX][NMAX])
{
int i, j;
for(i = 1; i <= n; ++i)
{
for(j = 1; j <= m; ++j)
printf("%d ", p[i][j]);
printf("\n");
}
}
int main()
{
freopen("rj.in", "r", stdin);
freopen("rj.out", "w", stdout);
read();
bordare();
parcurgere(ri, rj, r);
parcurgere(ji, jj, j);
write();
fclose(stdin);
fclose(stdout);
return 0;
}