#include<stdio.h>
const int dx[]={-1,0,1,0};
const int dy[]={0,1,0,-1};
struct cod{
int x,y;
};
cod coada[3000000];
int dist[1005][1005],cost[1005][1005];
int nr[1005][1005],x1,x2,y1,y2,p,u;
char aux[1005];
void citire(int r,int c){
int i,j;
fgets(aux,10,stdin);
for(i=0;i<=r+1;++i)
nr[i][0]=nr[i][c+1]=1;
for(i=0;i<=c+1;++i)
nr[0][i]=nr[r+1][i]=1;
for(i=1;i<=r;++i){
fgets(aux,1010,stdin);
for(j=1;j<=c;++j){
if(aux[j-1]=='*')
nr[i][j]=1;
if(aux[j-1]=='D'){
nr[i][j]=10;
coada[u].x=i;
coada[u].y=j;
++u;
}
if(aux[j-1]=='I'){
x1=i;
y1=j;
}
if(aux[j-1]=='O'){
x2=i;
y2=j;
}
}
}
}
/*void scrie(int r,int c){
int i,j;
for(i=0;i<=r+1;++i){
for(j=0;j<=c+1;++j)
printf("%3d,%d",pred[i][j].x,pred[i][j].y);
printf("\n");
}
}*/
void lee1(int r,int c){
int i,x,y;
while(p!=u){
for(i=0;i<4;++i){
x=coada[p].x;
y=coada[p].y;
if(nr[x+dx[i]][y+dy[i]]==0){
if(dist[x+dx[i]][y+dy[i]]==0){
dist[x+dx[i]][y+dy[i]]=dist[x][y]+1;
coada[u].x=x+dx[i];
coada[u].y=y+dy[i];
nr[x+dx[i]][y+dy[i]]=15;
++u;
}
}
}
++p;
}
}
inline int min(int a,int b){
return a<b?a:b;
}
void lee2(int r,int c){
int i,x,y;
p=0;
u=1;
coada[0].x=x1;
coada[0].y=y1;
cost[x1][y1]=dist[x1][y1];
while(p!=u){
x=coada[p].x;
y=coada[p].y;
for(i=0;i<4;++i){
if(nr[x+dx[i]][y+dy[i]]==15){
if(cost[x+dx[i]][y+dy[i]]==0){
cost[x+dx[i]][y+dy[i]]=min(cost[x][y],dist[x+dx[i]][y+dy[i]]);
coada[u].x=x+dx[i];
coada[u].y=y+dy[i];
++u;
}
else{
if(min(dist[x+dx[i]][y+dy[i]],cost[x][y])>cost[x+dx[i]][y+dy[i]]){
cost[x+dx[i]][y+dy[i]]=min(cost[x][y],dist[x+dx[i]][y+dy[i]]);
coada[u].x=x+dx[i];
coada[u].y=y+dy[i];
++u;
}
}
}
}
++p;
}
}
int main(){
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int r,c;
scanf("%d%d",&r,&c);
citire(r,c);
lee1(r,c);
lee2(r,c);
// scrie(r,c);
if(cost[x2][y2]==0)
printf("-1\n");
else
printf("%d\n",cost[x2][y2]);
fclose(stdin);
fclose(stdout);
return 0;
}