#include <cstdio>
using namespace std;
const int x_a[4] = {1,-1,0,0};
const int y_a[4]= {0,0,1,-1};
int x[1001 * 1001];
int y[1001 * 1001];
int d_x[1001 * 1001];
int d_y[1001 * 1001];
int v[1001][1001], d[1001][1001], cop[1001][1001];
int lee_initia( int n, int m )
{
int i, j;
for( i = 1; i <= n; ++i )
for( j = 1; j <= m; ++j ) v[i][j] = cop[i][j];
}
int lee( int n, int m, int x_i, int y_i, int x_s, int y_s, int mid )
{
int x_aa, y_aa, s, k, i, j;
s = k = 1;
x[1] = x_i;
y[1] = y_i;
v[x_i][y_i] = 0;
while( s <= k ){
for( i = 0; i <= 3; ++i ){
x_aa = x_a[i] + x[s];
y_aa = y_a[i] + y[s];
if( x_aa > 0 && x_aa <= n && x_aa <= m && y_aa > 0 && y_aa <= m && v[x_aa][y_aa] > v[x[s]][y[s]] + 1 && d[x_aa][y_aa] >= mid ){
k++;
x[k] = x_aa;
y[k] = y_aa;
v[x_aa][y_aa] = v[x[s]][y[s]] + 1;
}
}
s++;
}
/*for( i = 1; i <= n; ++i ){
for( j = 1; j <= m; ++j ) printf("%d ",v[i][j]);
printf("\n");
}*/
if( v[x_s][y_s] < 999999999 ) return true;
else return false;
}
int dragoni( int muha, int n, int m )
{
int x_aa, y_aa, ma, s, i, k, j;
j = 1;
while( j <= muha ){
s = k = 1;
x[1] = d_x[j];
y[1] = d_y[j];
d[x[1]][y[1]] = 0;
while( s <= k ){
for( i = 0; i <= 3; ++i ){
x_aa = x_a[i] + x[s];
y_aa = y_a[i] + y[s];
if( x_aa > 0 && x_aa <= n && x_aa <= m && y_aa > 0 && y_aa <= m && d[x_aa][y_aa] > d[x[s]][y[s]] + 1 ){
k++;
x[k] = x_aa;
y[k] = y_aa;
d[x_aa][y_aa] = d[x[s]][y[s]] + 1;
}
}
s++;
}
j++;
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int n, m, i, j, ma, st, dr, mid, x_i, x_s, y_i, y_s, rasp, ok, k;
k = 0;
char xasd;
scanf("%d%d",&n,&m);
for( i = 1; i <= n; ++i )
for( j = 1; j <= m; ++j ) d[i][j] = 999999999;
for( i = 1; i <= n; ++i ){
scanf("%*c");
for( j = 1; j <= m; ++j ){
scanf("%c",&xasd);
if( xasd == 'D' ){
k++;
d_x[k] = i;
d_y[k] = j;
d[i][j] = -999999999;
v[i][j] = 999999999;
cop[i][j] = 999999999;
}
else if ( xasd == '*' ){
v[i][j] = -999999999;
cop[i][j] = -999999999;
}
else if( xasd == 'O' ){
x_s = i;
y_s = j;
v[i][j] = 999999999;
cop[i][j] = 999999999;
}
else if( xasd == 'I' ){
x_i = i;
y_i = j;
v[i][j] = 999999999;
cop[i][j] = 999999999;
}
else{
v[i][j] = 999999999;
cop[i][j] = 999999999;
}
}
}
dragoni( k, n, m );
ma = 0;
for( i = 1; i <= n; ++i ){
for( j = 1; j <= m; ++j ){
if( d[i][j] >= ma ) ma = d[i][j];
//printf("%d ",d[i][j]);
}
//printf("\n");
}
ok = 0;
st = 0;
dr = ma;
mid = rasp = 0;
while( st <= dr ){
mid = ( st + dr ) / 2;
lee_initia(n,m);
//printf(">>%d\n",mid);
if( lee( n, m, x_i, y_i, x_s, y_s, mid ) ){
//printf("##%d\n",mid);
ok = 1;
rasp = mid;
st = mid + 1;
}
else dr = mid - 1;
}
if( ok == 1 ) printf("%d",rasp);
else printf("-1");
return 0;
}