#include<stdio.h>
#include<string.h>
#define max 1024
long v[max][max];
long xx[4]={0,1,0,-1},yy[4]={1,0,-1,0};
short int sel[max][max];
long sol[max][max];
long t[max*max][2];
long per[max*max][2];
long x1,x2,y1,y2,nr=0,nr_per=0;
void decod(char *a,long *vv,long r)
{
long i,x = strlen(a);
for( i = 0; i < x; i++)
{
if(a[i]=='.') vv[i+1]=0;
if(a[i]=='*') {vv[i+1]=-1;per[++nr_per][0]=r;per[nr_per][1]=i+1;}
if(a[i]=='D') {vv[i+1]=0;t[++nr][0]=r;t[nr][1]=i+1;sol[r][i+1]=1;}//pot mere pe langa dragon???
if(a[i]=='I') {x1=r;y1=i+1;}
if(a[i]=='O') {x2=r;y2=i+1;}
}
}
void calcdist()
{
long ii,i,a,aa,bb,b;
for(ii=1;ii<=nr;ii++)
{
a=t[ii][0];
b=t[ii][1];
for(i=0;i<=3;i++)
{
aa=a+xx[i];bb=b+yy[i];
if(sol[aa][bb]==0)
{
sol[aa][bb] = 1;
v[aa][bb]=v[a][b]+1;
t[++nr][0]=aa;
t[nr][1]=bb;
}
}
}
}
long ver(long a,long b,long c)
{
long aa,bb,i;
if(v[a][b]<c) return 0;
if(a==x2 && b==y2)
return 1;
sel[a][b]=1;
for(i=0;i<=3;i++)
{
aa=a+xx[i];bb=b+yy[i];
if(sel[aa][bb]==1) continue;
if(ver(aa,bb,c)) return 1;
}
return 0;
}
void afisare(long n,long m)
{
long i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
printf("%ld",v[i][j]);
printf("\n");
}
}
int main()
{
long i,n,m,j,mij,st,dr;
char c[max];
freopen("barbar.in","rt",stdin);
freopen("barbar.out","wt",stdout);
scanf("%ld%ld",&n,&m);
for(i=0;i<=n+1;i++)
for(j=0;j<=m+1;j++)
{v[i][j]=-2;sol[i][j]=1;}
for(i=1;i<=n;i++) for(j=1;j<=m;j++) sol[i][j]=0;
for(i=1;i<=n;i++)
{
scanf("%s",c);
decod(c,v[i],i);
}
calcdist();
for(i=1;i<=nr_per;i++) v[per[i][0]][per[i][1]]=-1;
//afisare(n,m);
st=1;
dr=v[x1][y1];
if(v[x2][y2]<dr) dr=v[x2][y2];
//while(1);
while(st!=dr)
{
mij = (st+dr)/2;
if(ver(x1,y1,mij+1)) st = mij+1;
else dr=mij;
memset(sel,0,sizeof(sel));
}
if(ver(x1,y1,st)==1)
printf("%ld\n",st);
else printf("-1");
}