#include <stdio.h>
#include <stdlib.h>
int mat[1002][1002], dirx[4]={-1, 0, 1, 0}, diry[4]={0, 1, 0, -1}, coada[3][1000000];
char ver[1002][1002];
int sx, sy, fx, fy, zs, zf;
void add(int i, int j, int nr){
coada[0][zf]=i;
coada[1][zf]=j;
coada[2][zf]=nr;
zf++;
}
void lee(){
int y, i;
for(i=zs;i<zf;i++){
mat[coada[0][i]][coada[1][i]]=coada[2][i];
for(y=0;y<4;y++)
if(mat[coada[0][i]+dirx[y]][coada[1][i]+diry[y]]==0)
add(coada[0][i]+dirx[y], coada[1][i]+diry[y], coada[2][i]+1);
}
}
void lee2(int nr){
int y, i;
for(i=zs;i<zf;i++){
ver[coada[0][i]][coada[1][i]]=1;
for(y=0;y<4;y++)
if(ver[coada[0][i]+dirx[y]][coada[1][i]+diry[y]]==0 && mat[coada[0][i]+dirx[y]][coada[1][i]+diry[y]]>=nr)
add(coada[0][i]+dirx[y], coada[1][i]+diry[y], 1);
}
}
void curat(int r, int c){
int i, j;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
ver[i][j]=0;
}
int main(){
FILE *fin, *fout;
int r, c, i, j, poz, pas;
char ch;
fin=fopen("barbar.in", "r");
fout=fopen("barbar.out", "w");
fscanf(fin, "%d%d ", &r, &c);
for(i=0;i<=r+1;i++){
mat[i][0]=-1;
mat[i][c+1]=-1;
}
for(i=0;i<=c+1;i++){
mat[0][i]=-1;
mat[r+1][i]=-1;
}
zs=0;
zf=0;
for(i=1;i<=r;i++){
for(j=1;j<=c;j++){
fscanf(fin, "%c", &ch);
if(ch=='I'){
sx=i;
sy=j;
}
if(ch=='*')
mat[i][j]=-1;
if(ch=='O'){
fx=i;
fy=j;
}
if(ch=='D')
add(i, j, 1);
}
fgetc(fin);
}
lee();
pas=1<<9;
poz=0;
while(pas!=0){
zs=0;
zf=0;
add(sx, sy, 1);
lee2(poz+pas);
if(ver[fx][fy]==1)
poz+=pas;
pas/=2;
curat(r, c);
}
fprintf(fout, "%d", poz-1);
fclose(fin);
fclose(fout);
return 0;
}