#include<stdio.h>
FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");
int soll,ok,nn,p,u,pp,uu,i,j,iv,jv,n,m,xf,yf,xs,ys,k,sol,a[2002][2002],vi[2000001],vj[2000001],ci[2000001],cj[2000001],x,viz[2000001];
int di[4]={0,1,0,-1};
int dj[4]={1,0,-1,0};
int main() {
fscanf(f,"%d%d\n",&n,&nn);
for(i=1;i<=n;++i){
for(j=1;j<=nn;++j){
fscanf(f,"%c",&x);
if(x=='.')
a[i][j]=0;
else if(x=='*')
a[i][j]=1;
else if(x=='D'){
vi[++k]=i;
vj[k]=j;
a[i][j]=-1;
}
else if(x=='I'){
xs=i;
ys=j;
}else if(x=='O'){
xf=i;
yf=j;
}
}
fscanf(f,"\n");
}
for(i=0;i<=n+1;++i)
a[i][0]=a[i][nn+1]=1;
for(i=0;i<=nn+1;++i)
a[0][i]=a[n+1][i]=1;
p=0;u=2000;
while(p<=u){
m=(p+u)/2;
pp=1;
uu=k;
ok=1;
if(!m)
for(i=1;i<=k;++i)
a[vi[i]][vj[i]]=-1;
while(pp<=uu&&ok){
i=vi[pp];
j=vj[pp];
for(int d=0;d<4;++d){
iv=i+di[d];
jv=j+dj[d];
if(a[iv][jv]==0){
if(viz[pp]-1<-m){
ok=0;
break;
}
vi[++uu]=iv;
vj[uu]=jv;
viz[uu]=viz[pp]-1;
a[iv][jv]=-1;
}
}
++pp;
}
pp=1;
uu=1;
ci[1]=xs;
cj[1]=ys;
ok=1;
sol=0;
while(ok&&pp<=uu){
i=ci[pp];
j=cj[pp];
for(int d=0;d<4;++d){
iv=i+di[d];
jv=j+dj[d];
if(iv==xf&&jv==yf){
ok=0;
sol=1;
soll=1;
break;
}
if(a[iv][jv]==0){
ci[++uu]=iv;
cj[uu]=jv;
a[iv][jv]=-1;
}
}
++pp;
}
if(sol)
p=m+1;
else
u=m-1;
for(i=1;i<=n;++i)
for(j=1;j<=nn;++j)
if(a[i][j]<0)
a[i][j]=0;
}
if(soll)
fprintf(g,"%d",u+1);
else{
pp=1;
uu=1;
ci[1]=xs;
cj[1]=ys;
ok=1;
sol=0;
while(ok&&pp<=uu){
i=ci[pp];
j=cj[pp];
for(int d=0;d<4;++d){
iv=i+di[d];
jv=j+dj[d];
if(iv==xf&&jv==yf){
ok=0;
sol=1;
soll=1;
break;
}
if(a[iv][jv]==0){
ci[++uu]=iv;
cj[uu]=jv;
a[iv][jv]=-1;
}
}
++pp;
}
if (sol)
fprintf(g,"0");
else
fprintf(g,"-1");
}
fclose(g);
fclose(f);
return 0;
}