#include <stdio.h>
#include <values.h>
#include <algorithm>
using namespace std;
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
struct rec{ int s,d;} b[2][3000005];
int dx[] = {0, 0, -1, 1},
dy[] = {-1,1, 0, 0};
int a[1003][1003],c[1003][1003],xi,yi,xf,yf,n,m,i,j;
char x;
void lee1()
{
int p,aux,nr,i,l,u,r,t,j;
p=1; i=0; l=2; u=b[i][0].s;
while (p<=u) {
b[l][0].s=0;
for (p=1; p<=u; p++)
for (j=0; j<=3; j++) {
r=dx[j]; t=dy[j];
if (a[b[i][p].s+r][b[i][p].d+t]>(a[b[i][p].s][b[i][p].d]+1)) {
++b[l][0].s; nr=b[l][0].s;
b[l][nr].s=b[i][p].s+r;
b[l][nr].d=b[i][p].d+t;
a[b[i][p].s+r][b[i][p].d+t]=a[b[i][p].s][b[i][p].d]+1;
}
}
aux=i; i=l; l=aux;
p=1; u=b[i][0].s;
}
}
void lee2()
{
int p,aux,x,y,nr,i,l,u,r,t,j;
p=1; i=0; l=2; u=1;
b[i][0].s=1; b[i][1].s=xi; b[i][1].d=yi;
c[xi][yi]=a[xi][yi];
while (p<=u) {
b[l][0].s=0;
for (p=1; p<=u; p++)
for (j=0; j<=3; j++) {
r=dx[j]; t=dy[j]; x=b[i][p].s; y=b[i][p].d;
if ((b[i][p].s+r>0)&&(b[i][p].s+r<=n)&&(b[i][p].d+t>0)&&(b[i][p].d+t<=m)) {
if (min(c[x][y], a[x+r][y+t]) > c[x+r][y+t]) {
++b[l][0].s; nr=b[l][0].s;
b[l][p].s=x+r;
b[l][p].d=y+t;
c[x+r][y+t]=min(a[x+r][y+t],c[x][y]);
}
}
}
aux=i; i=l; l=aux;
p=1; u=b[i][0].s;
}
}
int main()
{
fscanf(f,"%d %d\n", &n, &m);
//for (i=0; i<=n+1; i++)
// for (j=0; j<=n+1; j++) a[i][j]=-1;
memset(a, 0xff, sizeof(a));
for (i=1; i<=n; i++) {
for (j=1; j<=m; j++) {
fscanf(f,"%c",&x);
if (x=='D') { b[0][++b[0][0].s].s=i; b[0][b[0][0].s].d=j; a[i][j]=0;}
else if (x=='*') a[i][j]=-1;
else {
a[i][j]=INT_MAX;
if (x=='I') {xi=i; yi=j; };
if (x=='O') {xf=i; yf=j; }
}
}
fscanf(f,"\n");
}
lee1();
c[xf][yf]=-1;
lee2();
fprintf(g,"%ld", c[xf][yf]);
return 0;
}