#include <stdio.h>
#define maxn 1005
#define inf maxn*maxn
#define pr(x) fprintf(stderr,#x" = %d\n",x)
struct marmota
{
int l, c;
};
int r, c, p=1, maxim, u, m [maxn] [maxn], x [maxn] [maxn];
char w [maxn] [maxn];
marmota pi, po, q [maxn*maxn*5];
void scan ()
{
int i, j;
scanf ("%d%d\n", &r, &c);
for (i=1; i<=r; ++i)
for (j=1; j<=c; ++j)
{
scanf("%c ", &w [i] [j]);
if (w [i] [j] == '.')
m [i] [j]=inf;
else
if (w [i] [j] == '*')
m [i] [j]=-1;
else
if (w [i] [j] == 'D')
{
m [i] [j]=0;
q [++u].l=i;
q [u].c=j;
}
else
if (w [i] [j] == 'I')
{
m [i] [j]=inf;
pi.l=i;
pi.c=j;
}
else
if (w [i] [j] == 'O')
{
m [i] [j]=inf;
po.l=i;
po.c=j;
}
}
}
void bordare ()
{
int i, j, r1=r+1, c1=c+1;
for (i=0; i<=r; ++i)
m [i] [0]=m [i] [r1]=-1;
for (j=0; j<=c; ++j)
m [0] [j]=m [c1] [j]=-1;
}
void lee1 ()
{
int i, la, ca, dl []={0, 0, 0, 1, -1}, dc []={0, -1, 1, 0, 0};
while (p <= u)
{
for (i=1; i<=4; ++i)
{
la=q [p].l+dl [i];
ca=q [p].c+dc [i];
if (m [la] [ca] > m [q [p].l] [q [p].c]+1)
{
m [la] [ca]=m [q [p].l] [q [p].c]+1;
q [++u].l=la;
q [u].c=ca;
}
}
++p;
}
}
void lee2 ()
{
int i, la, ca, n=0, dl []={0, 0, 0, 1, -1}, dc []={0, -1, 1, 0, 0};
p=u=1;
q [p].l=pi.l;
q [p].c=pi.c;
x [pi.l] [pi.c]=m [pi.l] [pi.c];
while (p <= u+n)
{
for (i=1; i<=4; ++i)
{
la=q [p].l+dl [i];
ca=q [p].c+dc [i];
if (x [la] [ca] < x [q [p].l] [q [p].c])
{
q [++u].l=la;
q [u].c=ca;
if (m [la] [ca] < x [q [p].l] [q [p].c])
x [la] [ca]=m [la] [ca];
else
x [la] [ca]=x [p [q].l] [p [q].c];
if (la == po.l && ca == po.c && x [la] [ca] > maxim)
maxim=x [la] [ca];
}
if (u == inf)
{
u=1;
n*=inf;
}
}
++p;
}
}
int main ()
{
freopen ("barbar.in", "r", stdin);
freopen ("barbar.out", "w", stdout);
scan ();
bordare ();//m [] []
lee1 ();//distanta de la fiecare punct la cel mai apropiat dragon -->m [i] [j]
lee2 ();
if (maxim)
printf ("%d\n", maxim);
else
printf ("-1\n");
return 0;
}