#include<stdio.h>
#include<string.h>
struct vec{long x,y;};
long f[1005][1005],dx[]={0,0,0,1,-1},dy[]={0,1,-1,0,0},n,m1,i,j,ld,viz[1005][1005],max,st,dr,da,bun,ff,m;
vec d[7000005],sa,fi;
char x;
long drum(long m,vec p)
{long i;
vec pp;
viz[p.x][p.y]=1;
if(p.x==fi.x&&p.y==fi.y)return 1;
for(i=1;i<=4;++i)
if(p.x+dx[i]<=n&&p.x+dx[i]>0&&p.y+dy[i]<=m1&&p.y+dy[i]>0)
if(f[p.x+dx[i]][p.y+dy[i]]>=m&&!viz[p.x+dx[i]][p.y+dy[i]]){pp.x=p.x+dx[i];pp.y=p.y+dy[i];if(drum(m,pp))return 1;}
return 0;
}
void bf(long dr)
{long st,i;
st=1;
while(st<=dr)
{for(i=1;i<=4;++i)
if(d[st].x+dx[i]<=n&&d[st].x+dx[i]>0&&d[st].y+dy[i]<=m1&&d[st].y+dy[i]>0)
if(f[d[st].x][d[st].y]+1<f[d[st].x+dx[i]][d[st].y+dy[i]])
{f[d[st].x+dx[i]][d[st].y+dy[i]]=f[d[st].x][d[st].y]+1;
d[++dr].x=d[st].x+dx[i];
d[dr].y=d[st].y+dy[i];}
++st;}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%ld%ld\n",&n,&m1);
for(i=1;i<=n;++i)
{
for(j=1;j<=m1;++j)
{scanf("%c ",&x);
f[i][j]=2000000000;
if(x=='D')d[++ld].x=i,d[ld].y=j,f[i][j]=0;
if(x=='I')sa.x=i,sa.y=j;
if(x=='O')fi.x=i,fi.y=j;
if(x=='*')f[i][j]=-1;}
scanf("\n");}
bf(ld);
max=f[sa.x][sa.y];
if(max>f[fi.x][fi.y])max=f[fi.x][fi.y];
st=0;dr=max;
if(f[fi.x][fi.y]==2000000000){printf("-1\n");return 0;}
while(st<=dr)
{m=(st+dr)/2;
da=drum(m,sa);
for(i=1;i<=n;++i)memset(viz[i],0,sizeof(viz[i]));
if(da){ff=1;bun=m;st=m+1;}
else dr=m-1;}
if(!ff)printf("-1\n");
else printf("%ld\n",bun);
return 0;
}