#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(a[i1][j1]>=0&&(a[i][j]==-1||a[i][j]>a[i1][j1]+1)) a[i][j]=a[i1][j1]+1;
}
int main(){
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char c;
scanf("%i%i\n",&n,&m);
fr(i,0,n) {
fr(j,0,m) {
scanf("%c",&c);
if(c=='D')a[i][j]=0;
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!='.') B[i][j]=1,a[i][j]=-1;
else a[i][j]=-1;
}
scanf("\n");
}
fr(i,0,n){
fr(j,1,m) upd1(i,j,i,j-1);
rf(j,0,m-1) upd1(i,j,i,j+1);
}
fr(j,0,m){
fr(i,1,n) upd1(i,j,i-1,j);
rf(i,0,n-1) upd1(i,j,i+1,j);
}
fr(i,0,n){
fr(j,0,m){
if(B[i][j])a[i][j]=-a[i][j];
B[i][j]=1;
}
}
b=2;
int l=-1,r=1022;
while(l<r){
int c=(l+r+1)/2;
if(p(c)) l=c;
else r=c-1;
++b;
}
printf("%i",l);
return 0;
}