#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,x,y,i,l,u,r,t,j;
p=1; i=0; l=1; u=b[i][0].s;
while (u>0) {
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 (a[x+r][y+t] > (a[x][y]+1)) {
nr=++b[l][0].s;
b[l][nr].s=x+r;
b[l][nr].d=y+t;
a[x+r][y+t]=a[x][y]+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=1; u=1;
b[i][0].s=1; b[i][1].s=xi; b[i][1].d=yi;
c[xi][yi]=a[xi][yi];
while (u>0) {
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 ((x+r>0) && (x+r<=n) && (y+t>0) && (y+t<=m)&& (a[x+r][y+t]>0)) {
if (min(c[x][y], a[x+r][y+t]) > c[x+r][y+t]) {
nr=++b[l][0].s;
b[l][nr].s=x+r;
b[l][nr].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);
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] = (rec) { i, 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\n", c[xf][yf]);
return 0;
}