#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1002][1002],i,j,ip,jp,is,js,n,m,q[2][1000001],b[1002][1002],p,u,st,dr,mid,viz[1001][1001],sol,k;
int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};
char x;
void coadad(){
int lc,cc,ln,cn,i;
while(p<=u){
lc=q[0][p];
cc=q[1][p];
p++;
for(i=1;i<=4;i++){
ln=lc+dx[i];
cn=cc+dy[i];
if(a[ln][cn]==0&&b[ln][cn]==0){
b[ln][cn]=b[lc][cc]+1;
u++;
q[0][u]=ln;
q[1][u]=cn;
}
}
}
}
int coada(int x,int y,int d){
int p,u,lc,cc,ln,cn,i;
int dx[]={0,1,0,-1,0};
int dy[]={0,0,1,0,-1};
if(b[x][y]<d)
return 0;
p=u=1;
q[0][p]=x;
q[1][p]=y;
memset(viz,0,sizeof(viz));
viz[x][y]=1;
while(p<=u && viz[is][js]==0){
lc=q[0][p];
cc=q[1][p];
p++;
for(i=1;i<=4;i++){
ln=lc+dx[i];
cn=cc+dy[i];
if(a[ln][cn]==0 && b[ln][cn]>=d && viz[ln][cn]==0){
u++;
q[0][u]=ln;
q[1][u]=cn;
viz[ln][cn]=1;
}
}
}
return viz[is][js]==1;
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>x;
if(x=='.')
a[i][j]=0;
else
if(x=='*')
a[i][j]=2;
else
if(x=='D')
a[i][j]=1;
else
if(x=='I'){
ip=i;
jp=j;
}
else
if(x=='O'){
is=i;
js=j;
}
}
for(j=0;j<=m+1;j++){
a[0][j]=2;
a[n+1][j]=2;
}
for(i=0;i<=n+1;i++){
a[i][0]=2;
a[i][m+1]=2;
}
p=1;
u=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]==1){
u++;
q[0][u]=i;
q[1][u]=j;
}
coadad();
st=0;
dr=max(m,n);
sol=-1;
while(st<=dr){
mid=(st+dr)/2;
k=coada(ip,jp,mid);
if(k==1){
sol=mid;
st=mid+1;
}
else
dr=mid-1;
}
fout<<sol;
return 0;
}