#include <stdio.h>
#define lim 1005
int mat[lim][lim],d[lim][lim];
int l[4]={-1,0,1,0},c[4]={0,1,0,-1};
struct elem{int x,y;};
elem q[lim*lim];
int n,m,xi,yi,xf,yf,val,st,dr;
void bordare(){
int i,j;
for(i=0;i<=n+1;i++){
mat[i][0]=-1;
mat[i][m+1]=-1;
}
for(j=0;j<=m+1;j++){
mat[0][j]=-1;
mat[n+1][j]=-1;
}
}
void fill(int i,int j){
int k,ii,jj;
d[i][j]=1;
for(k=0;k<4;k++){
ii=i+l[k];
jj=j+c[k];
if(mat[ii][jj]>=val&&d[ii][jj]==0)
fill(ii,jj);
}
}
void lee(int st,int dr){
int i,j,ii,jj,k;
while(st<=dr){
i=q[st].x;
j=q[st].y;
for(k=0;k<4;k++){
ii=i+l[k];
jj=j+c[k];
if(mat[ii][jj]==0){
mat[ii][jj]=mat[i][j]+1;
dr++;
q[dr].x=ii;
q[dr].y=jj;
}
}
st++;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(mat[i][j]!=-1)
mat[i][j]-=1;
}
bool drum(int dist){
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
d[i][j]=0;
val=dist;
if(mat[xi][yi]>=val)
fill(xi,yi);
if(d[xf][yf]!=0)
return true;
else
return false;
}
int main(){
FILE *fin,*fout;
fin=fopen("barbar.in","r");
fout=fopen("barbar.out","w");
int i,j,mij,rasp;
char ch;
fscanf(fin,"%d%d\n",&n,&m);
bordare();
st=0;
dr=-1;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
fscanf(fin,"%c",&ch);
if(ch=='*')
mat[i][j]=-1;
if(ch=='D'){
dr++;
q[dr].x=i;
q[dr].y=j;
mat[i][j]=1;
}
if(ch=='I'){
xi=i;
yi=j;
}
if(ch=='O'){
xf=i;
yf=j;
}
}
fscanf(fin,"%c",&ch);
}
lee(st,dr);
st=0;
dr=n*m;
rasp=-1;
while(st<=dr){
mij=(st+dr)/2;
if(drum(mij)==true){
rasp=mij;
st=mij+1;
}
else
dr=mij-1;
}
fprintf(fout,"%d",rasp);
fclose(fin);
fclose(fout);
return 0;
}