#include<cstdio>
#include<cstring>
int v[1001][1001],c[2][1000001],d,n,m,i,j,nmin,u,p,mid,ic,jc,iv,jv,ne,pr,ut,iin,ifin,jin,jfin,ok,viz[1001][1001];
int d1[4]={1,-1,0,0};
int d2[4]={0,0,1,-1};
char x[1001][1001];
FILE *f,*g;
int main(){
f=fopen("barbar.in","r");
g=fopen("barbar.out","w");
fscanf(f,"%d%d\n",&n,&m);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
fscanf(f,"%c",&x[i][j]);
if(x[i][j]=='D'){
u++;
c[0][u]=i;
c[1][u]=j;
v[i][j]=0;
}
if(x[i][j]=='*')
v[i][j]=-2;
if(x[i][j]=='O'){
v[i][j]=-1;
ifin=i;
jfin=j;
}
if(x[i][j]=='I'){
v[i][j]=-1;
iin=i;
jin=j;
}
if(x[i][j]=='.')
v[i][j]=-1;
}
fscanf(f,"\n");
}
p=1;
while(p<=u){
ic=c[0][p];
jc=c[1][p];
for(d=0;d<=3;d++){
iv=ic+d1[d];
jv=jc+d2[d];
if(v[iv][jv]==-1 && iv>=1 && iv<=n && jv>=1 && jv<=m){
u++;
c[0][u]=iv;
c[1][u]=jv;
v[iv][jv]=v[ic][jc]+1;
}
}
p++;
}
p=0;
u=m*n;
while(p<=u){
mid=(p+u)/2;
pr=1;
ut=1;
c[0][1]=iin;
c[1][1]=jin;
ok=0;
memset(viz,0,sizeof(viz));
while(pr<=ut && ok==0){
ic=c[0][pr];
jc=c[1][pr];
for(d=0;d<=3;d++){
iv=ic+d1[d];
jv=jc+d2[d];
if(iv>=1 && iv<=n && jv>=1 && jv<=m && viz[iv][jv]==0 && v[iv][jv]>=mid){
ut++;
c[0][ut]=iv;
c[1][ut]=jv;
viz[iv][jv]=1;
if(iv==ifin && jv==jfin){
ok=1;
break;
}
}
}
pr++;
}
if(ok==1)
p=mid+1;
else
u=mid-1;
}
fprintf(g,"%d",u);
fclose(f);
fclose(g);
return 0;
}