#include <cstdlib>
#include <utility>
#include <queue>
#include <cstring>
#include <cstdio>
#define not_allowed 999999999
#define draggon 0
#define N 1010
int a[N][N];
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main ()
{int r,c,i,j;
int ls,cs,lf,cf,lt,ct,lu,cu,flag,flag2,min;
char linie[10002];
std::queue<std::pair<int,int> > q1,q2,*pq1=&q1,*pq2=&q2,*aux;
FILE *f,*fout;
for (i=0;i<N;i++)
{for(j=0;j<N;j++)
{a[i][j]=1000000000;
}
}
printf("%d",a[0][0]);
freopen("error.txt","w",stderr);
if((f=fopen("barbar.in","r"))==NULL)
{return 0;
}
if((fout=fopen("barbar.out","w"))==NULL)
{return 0;
}
fscanf(f,"%d %d\n",&r,&c);
for (i=0;i<r;i++)
{fscanf(f,"%s",linie);
for (j=0;j<c;j++)
{
if(linie[j]=='*')a[i+1][j+1]=not_allowed;
else if(linie[j]=='D')
{a[i+1][j+1]=draggon;
pq1->push(std::pair<int,int>(i+1,j+1));
}
else if(linie[j]=='I')ls=i+1,cs=j+1;
else if(linie[j]=='O')lf=i+1,cf=j+1;
}
}
do
{flag=0;
while(!pq1->empty())
{lt=pq1->front().first;
ct=pq1->front().second;
pq1->pop();
// fprintf(fout,"tata %d %d\n",lt,ct);
for (i=0;i<4;i++)
{lu=lt+d[i][0];
cu=ct+d[i][1];
if(0<lu&&lu<=c&&0<cu&&cu<=r&&
a[lu][cu]!=not_allowed&&
a[lt][ct]+1<a[lu][cu])
{flag=1;
a[lu][cu]=a[lt][ct]+1;
pq2->push(std::pair<int,int>(lu,cu));
// fprintf(fout," fiu %d %d\n",lt+d[i][0],ct+d[i][1]);
}
}
}
aux=pq1;pq1=pq2;pq2=aux;
}
while(flag);
while(!pq1->empty())pq1->pop();
while(!pq2->empty())pq2->pop();
min=a[ls][cs];
a[ls][cs]=-1;
pq1->push(std::pair<int,int>(ls,cs));
do
{flag=0;flag2=0;
while(!pq1->empty())
{lt=pq1->front().first;
ct=pq1->front().second;
pq1->pop();
for (i=0;i<4;i++)
{lu=lt+d[i][0];
cu=ct+d[i][1];
if(0<lu&&lu<=c&&0<cu&&cu<=r&&
a[lu][cu]!=-1&&a[lu][cu]!=not_allowed&&a[lu][cu]!=0)
{flag2=1;
if(lu==lf&&cu==cf){flag=1;break;}
if(a[lu][cu]>=min)
{pq1->push(std::pair<int,int>(lu,cu));
a[lu][cu]=-1;
}
else
{pq2->push(std::pair<int,int>(lu,cu));
}
}
}
if(flag==1)break;
}
aux=pq1;pq1=pq2;pq2=aux;
if(flag==1)
break;
else
min--;
}
while(flag2);
if(flag2!=0)
fprintf(fout,"%d\n",min);
else
fprintf(fout,"-1");
/*for (i=0;i<r;i++)
{for (j=0;j<c;j++)
{if(a[i+1][j+1]==999999)
fprintf(fout,"x ");
else
fprintf(fout,"%d ",a[i+1][j+1]);
}
fprintf(fout,"\n");
}*/
return 0;
}