#include <stdio.h>
struct ceva
{
int x,y;
};
ceva coada[10000005];
const int dx[]={0,0,1,-1};
const int dy[]={-1,1,0,0};
bool a[1005][1005];
int b[1005][1005],c[1005][1005],n,m,x1,x2,y2,y1;
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;
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])
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;
}
}
p=u+1;
u=u2;
}
//fprintf(stdout,"%d %d\n",n,m);
/* if (x==1)
{
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");
}
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
fprintf(stdout,"%d ",c[i][j]);
fprintf(stdout,"\n");
}
}*/
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);
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 (s[j]=='D')
{
u++;
coada[u].x=i;
coada[u].y=j;
a[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=m*n+2;
while (p<u)
{
m2=(p+u)/2;
if (exista(m2))
{
p=m2;
// fprintf(stdout,"p=%d\n",p);
}
else
{
u=m2-1;
// fprintf(stdout,"u=%d\n",u);
}
}
// fprintf(stdout,"%d\n",p);
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
c[i][j]=-2;
if (exista(p))
fprintf(out,"%d\n",p);
else
fprintf(out,"-1\n");
fclose(in);
fclose(out);
return 0;
}