#include <stdio.h>
#define fr(i,a,b) for(int i=a;i<b;++i)
#define rf(i,a,b) for(int i=b-1;i>=a;--i)
#define N 1000
int a[N][N];
int B[N][N],b;
int Qx[N*N],Qy[N*N],q;
int n,m;
int ix,iy,ox,oy;
inline void upd(int i,int j,int z){
if(i<0||i>=n)return;
if(j<0||j>=m)return;
if(B[i][j]==b)return;
if(a[i][j]<z)return;
B[i][j]=b;
Qx[q]=i;
Qy[q++]=j;
}
bool p(int z){
if(a[ix][iy]<z)return false;
int x=ix,y=iy;
q=1;
Qx[0]=x,Qy[0]=y;
B[x][y]=b;
fr(i,0,q){
x=Qx[i],y=Qy[i];
if(x==ox&&y==oy)return true;
upd(x-1,y,z);
upd(x+1,y,z);
upd(x,y-1,z);
upd(x,y+1,z);
}
return false;
}
inline void upd1(int i,int j,int i1,int j1){
if(i<0||i>=n)return;
if(j<0||j>=m)return;
if(B[i][j]==b)return;
if(a[i][j]!=-1&&a[i][j]<a[i1][j1]+1)return;
a[i][j]=a[i1][j1]+1;
Qx[q]=i,Qy[q++]=j;
B[i][j]=b;
}
int main(){
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char c;
scanf("%i%i\n",&n,&m);
q=0;
fr(i,0,n) {
fr(j,0,m) {
scanf("%c",&c);
if(c=='D')a[i][j]=0,Qx[q]=i,Qy[q++]=j;
else if(c=='I') ix=i,iy=j,a[i][j]=-1;
else if(c=='O') ox=i,oy=j,a[i][j]=-1;
else if(c!='.') a[i][j]=-2;
else a[i][j]=-1;
}
scanf("\n");
}
b=1;
fr(i,0,q){
upd1(Qx[i]-1,Qy[i],Qx[i],Qy[i]);
upd1(Qx[i]+1,Qy[i],Qx[i],Qy[i]);
upd1(Qx[i],Qy[i]-1,Qx[i],Qy[i]);
upd1(Qx[i],Qy[i]+1,Qx[i],Qy[i]);
}
fr(i,0,n)fr(j,0,m)B[i][j]=1;
b=2;
int l=-1,r=2046;
while(l<r){
int c=(l+r+1)/2;
if(p(c)) l=c;
else r=c-1;
++b;
}
printf("%i",l);
return 0;
}