#include <stdio.h>
struct ceva
{
int x,y;
};
ceva coada[1000005];
char aux;
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
int a[1005][1005],ver2[1000005];
int b[1005][1005],c[1005][1005],n,m,x1,x2,y2,y1,step;
char s[1030];
int ver(int x,int y)
{
if (x<1||x>n)
return 0;
if (y<1||y>m)
return 0;
return 1;
}
int exista(int x)
{
int p=1,u=1,i,u2,j;
coada[1].x=x1;
coada[1].y=y1;
if (b[x1][y1]<x||b[x2][y2]<x)
return 0;
/*if (x==0)
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
fprintf(stdout,"%d ",a[i][j]);
fprintf(stdout,"\n");
}*/
c[x1][y1]=x;
while (p<=u)
{
u2=u;
for (i=p;i<=u;i++)
{
for (j=0;j<4;j++)
{
if (ver(coada[i].x+dx[j],coada[i].y+dy[j])&&c[coada[i].x+dx[j]][coada[i].y+dy[j]]!=x&&a[coada[i].x+dx[j]][coada[i].y+dy[j]]!=1&&b[coada[i].x+dx[j]][coada[i].y+dy[j]]>=x)
{
if (x2==coada[i].x+dx[j]&&y2==coada[i].y+dy[j])
{
// fprintf(stdout,"1 %d\n",x);
return 1;
}
u2++;
coada[u2].x=coada[i].x+dx[j];
coada[u2].y=coada[i].y+dy[j];
c[coada[i].x+dx[j]][coada[i].y+dy[j]]=x;
}
// if (x==0&&coada[i].x+dx[j]==2&&coada[i].y+dy[j]==5)
// fprintf(stdout,"%d %d %d %d\n",ver(coada[i].x+dx[j],coada[i].y+dy[j]),c[coada[i].x+dx[j]][coada[i].y+dy[j]]!=x,a[coada[i].x+dx[j]][coada[i].y+dy[j]]!=1,b[coada[i].x+dx[j]][coada[i].y+dy[j]]>=x);
}
}
p=u+1;
u=u2;
}
//fprintf(stdout,"%d %d\n",n,m);
/*if (x==0)
{
for (i=1;i<=u;i++)
fprintf(stdout,"(%d,%d) ",coada[i].x,coada[i].y);
fprintf(stdout,"\n");
for (i=1;i<=n;i++)
{ for (j=1;j<=m;j++)
fprintf(stdout,"%d ",b[i][j]);
fprintf(stdout,"\n");
}*/
//fprintf(stdout,"0 %d\n",x);
return 0;
}
int main()
{
FILE *in,*out;
int p,u,u2,i,j,m2;
in=fopen("barbar.in","r");
out=fopen("barbar.out","w");
fscanf(in,"%d%d\n",&n,&m);
p=1;
u=0;
for (i=1;i<=n;i++)
{
fgets(s+1,m+10,in);
//fprintf(stdout,"%d:%s",i,s+1);
for (j=1;j<=m;j++)
{
if (s[j]=='I')
{
x1=i;
y1=j;
}
if (s[j]=='O')
{
x2=i;
y2=j;
}
if (s[j]=='*')
{
a[i][j]=1;
// if (a[2][5]==1)
// fprintf(stdout,"%s\nBravo ma !\n",s+1);
}
if (s[j]=='D')
{
u++;
coada[u].x=i;
coada[u].y=j;
a[i][j]=2;
//if (a[i][j]==1)
//{
// fprintf(stdout,"%s\nBravo ma !!!!!%d %d\n",s,i,j);
// }
}
//if (a[i][j]==1)
// fprintf(stdout,"%s\nBravo ma !\n",s+1);
}
}
a[2][5]=2;
// fprintf(stdout,"%d\n",a[2][5]);
//fprintf(stdout,"Initial:%d \n");
//for (i=1;i<=n;i++)
//{
// for (j=1;j<=m;j++)
// fprintf(stdout,"%d ",a[i][j]);
// fprintf(stdout,"\n");
//}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
c[i][j]=-2;
while (p<=u)
{
u2=u;
for (i=p;i<=u;i++)
{
for (j=0;j<4;j++)
if (ver(coada[i].x+dx[j],coada[i].y+dy[j])&&!b[coada[i].x+dx[j]][coada[i].y+dy[j]]&&!a[coada[i].x+dx[j]][coada[i].y+dy[j]])
{
b[coada[i].x+dx[j]][coada[i].y+dy[j]]=b[coada[i].x][coada[i].y]+1;
u2++;
coada[u2].x=coada[i].x+dx[j];
coada[u2].y=coada[i].y+dy[j];
}
}
p=u+1;
u=u2;
}
/* for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
fprintf(stdout,"%d ",b[i][j]);
fprintf(stdout,"\n");
}*/
p=0;
u=b[x2][y2]+2;
while (p<=u)
{
m2=(p+u)/2;
if (exista(m2)||ver2[m2])
{
ver2[m2]=1;
p=m2+1;
}
else
{
u=m2-1;
if (exista(u)||ver2[u])
{
fprintf(out,"%d\n",u);
fclose(in);
fclose(out);
return 0;
}
}
// fprintf(stdout,"%d %d %d %d\n",p,u,ver2[m2],m2);
}
// fprintf(stdout,"%d\n",p);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
c[i][j]=-2;
if (exista(p-1)||ver2[p-1])
fprintf(out,"%d\n",p);
else
fprintf(out,"-1\n");
fclose(in);
fclose(out);
return 0;
}