#include <cstdio>
#define MAXN 1000
char mat[MAXN+2][MAXN+2];
int cl[MAXN*MAXN],cc[MAXN*MAXN],lung[MAXN+2][MAXN+2],drum[MAXN+2][MAXN+2];
int dl[]={-1,0,0,1},dc[]={0,-1,1,0},n,m;
inline int cauta(int d,int l1,int c1,int l2,int c2){
int b,e,i,j,l,c;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
drum[i][j]=0;
cl[0]=l1;
cc[0]=c1;
drum[l1][c1]=1;
b=0;
e=1;
do{
for(i=0;i<4;i++){
l=dl[i]+cl[b];
c=dc[i]+cc[b];
if(lung[l][c]>=d&&mat[l][c]!='*'&&drum[l][c]==0){
drum[l][c]=drum[cl[b]][cc[b]]+1;
cl[e]=l;
cc[e]=c;
e++;
}
}
b++;
}while(b<e&&drum[l2][c2]==0);
if(drum[l2][c2]>0)
return 1;
return 0;
}
int main(){
FILE*fi,*fout;
int i,j,b,e,l1,c1,l2,c2,l,c,rez,pas;
fi=fopen("barbar.in" ,"r");
fout=fopen("barbar.out" ,"w");
fscanf(fi,"%d%d " ,&n,&m);
b=e=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
fscanf(fi,"%c" ,&mat[i][j]);
if(mat[i][j]=='D'){
cl[e]=i;
cc[e]=j;
lung[i][j]=1;
e++;
}
if(mat[i][j]=='I'){
l1=i;
c1=j;
}
if(mat[i][j]=='O'){
l2=i;
c2=j;
}
}
fscanf(fi,"\n");
}
for(i=0;i<=n+1;i++)
mat[i][0]=mat[i][m+1]='*';
for(i=0;i<=m+1;i++)
mat[0][i]=mat[n+1][i]='*';
do{
for(i=0;i<4;i++){
l=cl[b]+dl[i];
c=cc[b]+dc[i];
if(mat[l][c]!='*'&&lung[l][c]==0){
lung[l][c]=lung[cl[b]][cc[b]]+1;
cl[e]=l;
cc[e]=c;
e++;
}
}
b++;
}while(b<e);
rez=0;
for(pas=1<<15;pas;pas>>=1)
if(lung[l1][c1]>=rez+pas&&cauta(rez+pas,l1,c1,l2,c2)==1)
rez+=pas;
fprintf(fout,"%d" ,rez-1);
fclose(fi);
fclose(fout);
return 0;
}