#include<stdio.h>
#define N 1001
struct POS{
short int i,j;
};
POS drg[100001];
int nr,sl,sc,lo,co,m,n;
short int lache[N][N],brd[N][N];
void bord()
{
int i,j;
for(i=0;i<=n;++i)
lache[i][0]=lache[i][m+1]=-4;
for(i=0;i<=m;++i)
lache[0][i]=lache[n+1][i]=-4;
}
void scan()
{
char aux;
int i,j;
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
scanf("%c",&aux);
brd[i][j]=aux;
if(aux=='*')
lache[i][j]=-2;
if(aux=='D')
{
lache[i][j]=-3;
drg[nr].i=i;
drg[nr++].j=j;
}
if(aux=='.')
lache[i][j]=-1;
if(aux=='I')
{
lache[i][j]=0;
sl=i;
sc=j;
}
if(aux=='O')
{
lache[i][j]=0;
lo=i;
co=j;
}
}
scanf("\n");
}
}
int dl[4]={-1,1,0,0};
int dc[4]={0,0,-1,1};
int abs(int a,int b)
{
if(a<0)
a=-a;
if(b<0)
b=-b;
return a+b;
}
int get_closest_drg(POS y)
{
int trmd,i,max=1000000000;
for(i=0;i<nr;++i)
{
trmd=abs(y.i-drg[i].i,y.j-drg[i].j);
if(max>trmd)
max=trmd;
}
return max;
}
int navigate(int d,POS x,int sw)
{
if(d==0&&!sw)
return x.i-1;
if(d==1&&!sw)
return x.i+1;
if(d==2&&sw)
return x.j-1;
if(d==3&&sw)
return x.j+1;
if(!sw)
return x.i;
if(sw)
return x.j;
}
void lee()
{
POS q[500000],x,y;
int i,p=0,u=0,dst;
q[u].i=sl;
q[u].j=sc;
u++;
while(p!=u)
{
x.i=q[p].i;
x.j=q[p].j;
p++;
for(i=0;i<4;++i)
{
//y.x=x.x+dl[i];
//y.y=x.y+dc[i];
y.i=navigate(i,x,0);
y.j=navigate(i,x,1);
if(brd[y.i][y.j]!='D'&&brd[y.i][y.j]!='I')
{
dst=get_closest_drg(y);
if(!lache[x.i][x.j])
lache[x.i][x.j]=dst;
else
if(dst>lache[x.i][x.j])
dst=lache[x.i][x.j];
if(lache[y.i][y.j]>-2)
{
if(lache[y.i][y.j]<dst)
{
lache[y.i][y.j]=dst;
if(brd[y.i][y.j]!='*')
{
q[u].i=y.i;
q[u++].j=y.j;
}
}
}
}
}
}
}
/*void lee()
{
POS x,y,q[100000];
int p,u,i;
p=u=0;
q[u].i=lo;
q[u++].j=co;
while(p!=u)
{
x.i=q[p].i;
x.j=q[p++].j;
for(i=0;i<4;++i)
{
y.i=navigate(i,x,0);
y.j=navigate(i,x,1);
if(lache[y.i][y.j]>0||lache[y.i][y.j]==-1)
{
lache[y.i][y.j]=1+lache[x.i][x.j];
q[u].i=y.i;
q[u++].j=y.j;
}
}
}
}*/
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scan();
bord();
lee();
if(lache[lo][co]<=0)
printf("-1");
else
printf("%d",lache[lo][co]);
return 0;
}