#include<cstdio>
char ch[1005][1005];
int l[1000005],c[1000005],viz[1005][1005],d[1005][1005],dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int r,co,i,j,x,y,nx,ny,f=1,b=0,st=0,dr=0,mij,last=-1,ix,iy,fx,fy,ok=0;
scanf("%d%d\n",&r,&co);
for(i=1;i<=r;i++)
{
gets(ch[i]+1);
for(j=1;j<=co;j++)
{
if (ch[i][j]=='D')
l[++b]=i,c[b]=j,viz[i][j]=1;
if (ch[i][j]=='I')
ix=i,iy=j;
if (ch[i][j]=='O')
fx=i,fy=j;
}
scanf("\n");
}
for(i=0;i<=co+1;i++)
ch[0][i]=ch[r+1][i]='*';
for(i=0;i<=r+1;i++)
ch[i][0]=ch[i][co+1]='*';
while(f<=b)
{
x=l[f];
y=c[f];
f++;
if (d[x][y]>dr)
dr=d[x][y];
for(i=1;i<=4;i++)
{
nx=x+dx[i];
ny=y+dy[i];
if (ch[nx][ny]!='*' && viz[nx][ny]==0)
{
l[++b]=nx;
c[b]=ny;
d[nx][ny]=d[x][y]+1;
viz[nx][ny]=1;
}
}
}
while(st<=dr)
{
mij=(st+dr)/2;
for(i=1;i<=r;i++)
for(j=1;j<=co;j++)
viz[i][j]=0;
if (d[ix][iy]<mij)
{
dr=mij-1;
continue;
}
f=1;
b=1;
l[1]=ix;
c[1]=iy;
viz[ix][iy]=1;
while(f<=b)
{
x=l[f];
y=c[f];
f++;
for(i=1;i<=4;i++)
{
nx=x+dx[i];
ny=y+dy[i];
if (ch[nx][ny]!='*' && d[nx][ny]>=mij && viz[nx][ny]==0)
{
viz[nx][ny]=1;
l[++b]=nx;
c[b]=ny;
}
}
}
if (viz[fx][fy]==1)
{
last=mij;
st=mij+1;
}
else
dr=mij-1;
}
printf("%d\n",last);
return 0;
}