#include <cstdio>
#define fin "barbar.in"
#define fout "barbar.out"
#define Nmax 1001
int N,M,map[Nmax][Nmax],viz[Nmax][Nmax];
int v[Nmax*Nmax][2];
int sx,sy,fx,fy;
int vf,pr,val,ret,lim;
void ins(int x,int y) {
if (x<1 || x>N || y<1 || y>M) return;
if (map[x][y]) return ;
map[x][y]=val+1;
++vf;
v[vf][0]=x; v[vf][1]=y;
}
void go() {
int x,y,i,curr;
curr=vf;
for (i=pr;i<=curr;++i) {
x=v[i][0]; y=v[i][1];
if (map[x][y]==-1)
val=0;
else
val=map[x][y];
ins(x-1,y); ins(x+1,y);
ins(x,y-1); ins(x,y+1);
}
pr=curr+1;
if (pr<=vf) go();
}
void ins1(int x,int y) {
if (x<1 || x>N || y<1 || y>M) return;
if (map[x][y]<lim || viz[x][y]) return ;
viz[x][y]=1;
++vf;
v[vf][0]=x; v[vf][1]=y;
}
void go1() {
int x,y,i,curr;
curr=vf;
for (i=pr;i<=curr;++i) {
x=v[i][0]; y=v[i][1];
if (map[x][y]>=lim) {
viz[x][y]=1;
ins1(x-1,y); ins1(x+1,y);
ins1(x,y-1); ins1(x,y+1);
}
}
pr=curr+1;
if (pr<=vf) go1();
}
int main() {
int i,j;
char c;
freopen(fin,"r",stdin); freopen(fout,"w",stdout);
scanf("%d%d",&N,&M);
for (i=1;i<=N;++i) {
fgetc(stdin);
for (j=1;j<=M;++j) {
scanf("%c",&c);
if (c=='*')
map[i][j]=-1;
if (c=='D') {
map[i][j]=-1;
vf++;
v[vf][0]=i;
v[vf][1]=j;
}
if (c=='I') {
sx=i; sy=j;
}
if (c=='O') {
fx=i; fy=j;
}
}
}
pr=1;
go(); //BF pt dist minime
/*
for (i=1;i<=N;++i) {
for (j=1;j<=M;++j)
fprintf(stderr,"%d ",map[i][j]);
fprintf(stderr,"\n");
}
*/
int m,lo,hi;
lo=1; hi=N*M+1;
ret=-1;
while (lo <= hi) {
m=(lo+hi)/2;
pr=1; vf=1;
v[vf][0]=sx; v[vf][1]=sy;
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
viz[i][j]=0;
lim=m;
go1(); //go ionel
// fprintf(stderr,"%d %d %d\n",lo,hi,viz[fx][fy]);
/* for (i=1;i<=N;++i) {
for (j=1;j<=M;++j)
fprintf(stderr,"%d ",viz[i][j]);
fprintf(stderr,"\n");
}
*/
if (!viz[fx][fy])
hi=m-1;
else {
pr=1; vf=1;
v[vf][0]=sx; v[vf][1]=sy;
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
viz[i][j]=0;
lim=m+1;
go1();
if (viz[fx][fy])
lo=m+1;
else {
ret=m;
break;
}
}
}
printf("%d\n",ret);
return 0;
}