#include<stdio.h>
#define Max 1024
FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");
int n,m,ok;
int a[Max][Max], b[Max][Max];
int c[2][Max*Max];
int p,u;
int x1,x2,y1,y2;
void read()
{
int i,j;
fscanf(f,"%d %d\n",&n,&m);
char x;
for(i=0;i<=m+1;++i) b[0][i]=b[n+1][i]=a[0][i]=a[n+1][i]=-1;
for(i=0;i<=n+1;++i) b[i][0]=b[i][m+1]=a[i][0]=a[i][m+1]=-1;
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
fscanf(f,"%c",&x);
if(x=='I'){ x1=i,y1=j,a[i][j]=-2,b[i][j]=-2; }
else if(x=='O') {x2=i, y2=j , a[i][j]=-2, b[i][j]=-2; }
else if(x=='D')
{
c[0][p]=i;
c[1][p++]=j;
a[i][j]=0;
b[i][j]=-1;
}
else if(a[i][j]=='*') {a[i][j]=-1, b[i][j]=-1;}
else a[i][j]=b[i][j]=-2;
}
fscanf(f,"\n");
}
}
int dx[4]={0,0,1,-1};
int dy[4]={-1,1,0,0};
void bfs()
{
int nx,ny,x,y,i;
u=p-1;
p=0;
while(p<=u)
{
x=c[0][p];
y=c[1][p++];
for(i=0;i<4;++i)
{
nx=x+dx[i]; ny=y+dy[i];
if(a[nx][ny]==-2)
{
a[nx][ny]=a[x][y]+1;
c[0][++u]=nx;
c[1][u]=ny;
}
}
}
}
int bf(int l)//pot calatori a.i. dist pana la cel mai apropiat dragon este cel putin l
{
if(a[x1][y1] < l ) return 0;
int p=0,u=0;
int d[Max][Max];
int i,j;
for(i=0;i<=n+1;++i)
for(j=0;j<=m+1;++j)
d[i][j]=b[i][j];
int x,y,nx,ny;
c[0][0]=x1; c[1][0]=y1;
d[x1][y1]=0;
while(p<=u && d[x2][y2]==-2)
{
x=c[0][p];
y=c[1][p++];
for(i=0;i<4;++i)
{
nx=dx[i]+x; ny=y+dy[i];
if(d[nx][ny]==-2 && a[nx][ny]>=l)
{
d[nx][ny]=d[x][y]+1;
c[0][++u]=nx;
c[1][u]=ny;
}
}
}
if(d[x2][y2] != -2) {/*fprintf(g,"\n%d\n",l); afis(d);*/ return 1; }
else return 0;
}
void binar()
{
int p,r,i,j,l;
i=1; j=m*n;
while(i<=j)
{
l=(i+j)/2;
r=bf(l);
if(r==0) j=l-1;
else
{
p=bf(l+1);
if(p==0)
{
ok=1;
fprintf(g,"%d\n",l);
return;
}
else i=l+1;
}
}
}
int main()
{
read();
bfs();
binar();
if(!ok) fprintf(g,"-1\n");
return 0;
}