#include<stdio.h>
#define N 1002
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
int r,c,b[N][N],p,u,d[N][N];
char a[N][N];
struct vec{
int x,y;
}coada[4*N*N],pi,pf;
void read()
{
int i,j;
char ch;
scanf("%d%d\n",&r,&c);
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
scanf("%c",&a[i][j]);
b[i][j]=N*N;
if(a[i][j]=='D')
{
coada[u++]=(vec){i,j};
b[i][j]=0;
}
if(a[i][j]=='I')
pi=(vec){i,j};
if(a[i][j]=='O')
pf=(vec){i,j};
}
scanf("%c",&ch);
}
for(i=0;i<=r+1;i++)
a[i][0]=a[r+1][0]='*';
for(j=0;j<=c+1;j++)
a[0][j]=a[0][c+1]='*';
}
void afis_a()
{
int i,j;
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
printf("%c",a[i][j]);
printf("\n");
}
}
void afis(int b[N][N])
{
int i,j;
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
printf("%d ",b[i][j]);
printf("\n");
}
}
void create_b()
{
int x1,y1,x2,y2,i;
for(;p<u;p++)
{
x1=coada[p].x;
y1=coada[p].y;
for(i=0;i<4;i++)
{
x2=x1+dx[i];
y2=y1+dy[i];
if(b[x2][y2]==N*N)
{
b[x2][y2]=b[x1][y1]+1;
coada[u++]=(vec){x2,y2};
}
}
}
}
inline int min(int a,int b)
{
return a<b?a:b;
}
void solve()
{
int x1,y1,x2,y2,i;
d[pi.x][pi.y]=b[pi.x][pi.y];
u=p=0;
coada[u++]=(vec){pi.x,pi.y};
for(;p<u;p++)
{
x1=coada[p].x;
y1=coada[p].y;
for(i=0;i<4;i++)
{
x2=x1+dx[i];
y2=y1+dy[i];
if(min(d[x1][y1],b[x2][y2])>d[x2][y2]&&a[x2][y2]!='*'&&a[x2][y2]!='D')
{
d[x2][y2]=min(d[x1][y1],b[x2][y2]);
//pred[x2][y2]=(i+2)%4;
coada[u++]=(vec){x2,y2};
}
}
}
}
/*void drum(int x,int y)
{
if(x!=pi.x||y!=pi.y)
drum(x+dx[pred[x][y]],y+dy[pred[x][y]]);
printf("(%d,%d)->",x,y);
}*/
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
read();
//afis();
create_b();
solve();
//afis(b);
//afis(d);
//drum(pf.x,pf.y);
printf("%d\n",d[pf.x][pf.y]==0?-1:d[pf.x][pf.y]);
return 0;
}