#include<stdio.h>
#define INF 200
int max,viz[1001][1001],fi,fj,ii,ji,sol,p,u,mij,c[2][1000001],n,D[2][1000001],DD,m,i,j,d[1001][1001],q[2][5]={{0,1,0,-1},{1,0,-1,0}};
char a[1001][1001];
int coada(int x){
int A,B,i,p=1,u=1;
c[0][p]=ii;
c[1][p]=ji;
viz[ii][ji]=x;
if(d[ii][ji]<x)
return 0;
while(p<=u){
for(i=0;i<=3;i++){
A=c[0][p]+q[0][i];
B=c[1][p]+q[1][i];
if(viz[A][B]!=x&&d[A][B]>=x&&a[A][B]!='*'&&A>0&&A<=n&&B>0&&B<=m){
u++;
c[0][u]=A;
c[1][u]=B;
viz[A][B]=x;
if(A==fi&&B==fj)
return 1;
}
}
p++;
}
x=0;
return x;
}
void dist(int x,int y){
int A,B,p=1,u=1,i,X;
c[0][p]=x;
c[1][p]=y;
d[x][y]=0;
while(p<=u){
for(i=0;i<=3;i++){
A=c[0][p]+q[0][i];
B=c[1][p]+q[1][i];
if(a[A][B]!='*'&& A>0 && A<=n && B>0 && B<=m){
X=d[c[0][p]][c[1][p]]+1;
if(d[A][B]>(X)){
d[A][B]=X;
u++;
c[0][u]=A;
c[1][u]=B;
}
}
}
p++;
}
}
int main(){
for(i=1;i<=12;i++)
a[i][0]='0';
FILE *f=fopen("barbar.in","r");
fscanf(f,"%d %d\n",&n,&m);
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
d[i][j]=INF;
viz[i][j]=-1;
fscanf(f,"%c",&a[i][j]);
if(a[i][j]=='D'){
DD++;
D[0][DD]=i;
D[1][DD]=j;
}
if(a[i][j]=='I'){
ii=i;
ji=j;
}
if(a[i][j]=='O'){
fi=i;
fj=j;
}
}
fscanf(f,"\n");
}
fclose(f);
max=-1;
for(i=1;i<=DD;i++){
dist(D[0][i],D[1][i]);
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
if(d[i][j]>max&d[i][j]!=INF)
max=d[i][j];
}
p=0;
u=max;
sol=-1;
while(p<=u){
mij=(p+u)/2;
if(coada(mij)){
sol=mij;
p=mij+1;
}
else
u=mij-1;
}
FILE *g=fopen("barbar.out","w");
fprintf(g,"%d",sol);
fclose(g);
return 0;
}