#include<stdio.h>
#include<string>
FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");
int min ( int a, int b ){
if ( a > b )
return b;
return a;
}
int n,m,b[1005][1005],i,j,ii,xfin,yfin,xinit,yinit,p,u,mij,d,iv,jv,ic,jc;
char a[1005][1005],ok;
int c[2][1005*1005]; // int t[1005*1005];
int di[4] = {1,-1,0,0};
int dj[4] = {0,0,1,-1};
/*void afisare (int u) {
while ( u != 0 ){
fprintf(g,"%d %d\n",c[0][u],c[1][u]);
u = t[u];
}
}
*/
int coada ( int x ) {
int p,u,ic,jc,iv,jv;
int d;
char viz[1005][1005]; //int c[2][1005*1005];
memset(viz,0,sizeof(viz));
memset(c,0,sizeof(c));
c[0][1] = xinit; c[1][1] = yinit;
p = u = 1 ;
viz[xinit][yinit] = 1 ;
while ( p <= u ){
ic = c[0][p]; jc = c[1][p];
for ( d = 0 ; d <= 3 ; ++d ){
iv = ic + di[d]; jv = jc + dj[d];
if( iv >= 1 && iv <= n && jv >= 1 && jv <= m && viz[iv][jv] == 0 && a[iv][jv] != '*' && b[iv][jv] >= x ){
++u ;
c[0][u] = iv ; c[1][u] = jv ;
viz[iv][jv] = 1 ;
//t[u] = p ;
if ( iv == xfin && jv == yfin && b[iv][jv] >= x ){
ok = 1 ;
//if ( x == 3 )
// afisare(u);
return 1;
}
}
}
++p;
}
return 0;
}
int main () {
fscanf(f,"%d %d\n",&n,&m);
for ( i = 1 ; i <= n ; ++i ){
fscanf( f,"%s",a[i] + 1 ) ;
for ( j = 1 ; j <= m ; ++j ){
b[i][j] = 2000 ;
if ( a[i][j] == 'I' ){
xinit = i ; yinit = j ;
continue;
}
if ( a[i][j] == 'D' ){
b[i][j] = 0 ;
c[0][++u] = i ;
c[1][u] = j;
for ( ii = i ; ii <= n ; ++ii )
b[ii][j] = min ( b[ii][j] , ii - i ) ;
for ( ii = i ; ii >= 1 ; ii -- )
b[ii][j] = min ( b[ii][j] , i - ii ) ;
for ( ii = j ; ii <= m ; ii ++ )
b[i][ii] = min ( b[i][ii] , ii - j ) ;
for ( ii = j ; ii >= 1 ; ii -- )
b[i][ii] = min ( b[i][ii] , j - ii ) ;
continue;
}
if ( a[i][j] == 'O' )
xfin = i , yfin = j ;
}
}
p = u = 1 ;
/*while ( p <= u ){
ic = c[0][p]; jc = c[1][p];
for ( d = 0; d <= 3 ; ++d ){
iv = ic + di[d] ; jv = jc + dj[d] ;
if(b[iv][jv] == 2000){
b[iv][jv] = b[ic][jc] + 1 ;
++u;
c[0][u] = iv; c[1][u] = jv;
}
}
++p;
}
*/
p = 0 ;
//u = m * n ;
if ( n > m )
u = n ;
else
u = m ;
while ( p <= u ){
mij = p + (u - p ) / 2 ;
// coada(x) == 1 daca poate traversa trecand doar cu distanta >= x
if ( coada(mij) == 1 )
p = mij + 1 ;
else
u = mij - 1 ;
}
if( ok == 0 )
fprintf( g, "-1\n" ) ;
else
fprintf(g,"%d\n",u);
fclose(f);
fclose(g);
return 0;
}