#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#define BUF_SIZE 16384
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi;
inline char nextch(){
if(pbuf==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fi);
pbuf=0;
}
return buf[pbuf++];
}
inline int nextnum(){
int a=0;
char c=nextch();
while(c<'0' || c>'9')
c=nextch();
while('0'<=c && c<='9'){
a=a*10+c-'0';
c=nextch();
}
return a;
}
int d[1001][1001];
int vst[1001][1001];
int q[2000000][2], p, u, row, column;
inline int valid(int l, int c){
if(l>0 && l<=row && c>0 && c<=column && vst[l][c]==0)
return 1;
return 0;
}
int dfs(int x1, int y1, int x2, int y2, int lim){
for(int i=1;i<=row;i++)
for(int j=1;j<=column;j++)
vst[i][j]=0;
int dir[4][2]={{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
vst[x1][y1]=1;
p=u=0;
q[u][0]=x1;
q[u][1]=y1;
u++;
while(p<u){
for(int i=0;i<4;i++){
if(valid(q[p][0]+dir[i][0], q[p][1]+dir[i][1]) && d[q[p][0]+dir[i][0]][q[p][1]+dir[i][1]]>=lim){
vst[q[p][0]+dir[i][0]][q[p][1]+dir[i][1]]=1;
q[u][0]=q[p][0]+dir[i][0];
q[u][1]=q[p][1]+dir[i][1];
u++;
}
}
p++;
}
if(vst[x2][y2]==1)
return 1;
return 0;
}
int main(){
int i1, i2, o1, o2;
FILE*fo;
fi=fopen("barbar.in","r");
fo=fopen("barbar.out","w");
fscanf(fi,"%d%d", &row, &column);
nextch();
for(int i=1;i<=row;i++)
for(int j=1;j<=column;j++)
d[i][j]=-1;
for(int i=1;i<=row;i++){
for(int j=1;j<=column;j++){
char c=nextch();
switch(c){
case 'D':{
d[i][j]=0;
vst[i][j]=1;
q[u][0]=i;
q[u][1]=j;
u++;
break;
}
case '*':{
d[i][j]=-2;
vst[i][j]=1;
break;
}
case 'I':{
i1=i;
i2=j;
break;
}
case 'O':{
o1=i;
o2=j;
break;
}
}
}
nextch();
}
while(p<u){
if(valid(q[p][0]-1, q[p][1])){
q[u][0]=q[p][0]-1;
q[u][1]=q[p][1];
u++;
d[q[p][0]-1][q[p][1]]=1+d[q[p][0]][q[p][1]];
vst[q[p][0]-1][q[p][1]]=1;
}
if(valid(q[p][0]+1, q[p][1])){
q[u][0]=q[p][0]+1;
q[u][1]=q[p][1];
u++;
d[q[p][0]+1][q[p][1]]=1+d[q[p][0]][q[p][1]];
vst[q[p][0]+1][q[p][1]]=1;
}
if(valid(q[p][0], q[p][1]-1)){
q[u][0]=q[p][0];
q[u][1]=q[p][1]-1;
u++;
d[q[p][0]][q[p][1]-1]=1+d[q[p][0]][q[p][1]];
vst[q[p][0]][q[p][1]-1]=1;
}
if(valid(q[p][0], q[p][1]+1)){
q[u][0]=q[p][0];
q[u][1]=q[p][1]+1;
u++;
d[q[p][0]][q[p][1]+1]=1+d[q[p][0]][q[p][1]];
vst[q[p][0]][q[p][1]+1]=1;
}
p++;
}
int st=0, dr=d[i1][i2];
while(dr-st>1){
int m=(st+dr)/2;
//printf("%d %d\n", m, dfs(i1, i2, o1, o2, m));
if(dfs(i1, i2, o1, o2, m))
st=m;
else
dr=m-1;
}
if(dfs(i1, i2, o1, o2, dr))
fprintf(fo,"%d", dr);
else
fprintf(fo,"%d", st);
/*for(int i=1;i<=row;i++){
for(int j=1;j<=column;j++)
fprintf(fo,"%02d ", d[i][j]);
fprintf(fo,"\n");
}*/
fclose(fi);
fclose(fo);
return 0;
}