#include <cstdio>
#define NMmax 1000+10
using namespace std;
struct nod
{
int l,c,v;
};
nod plecare,final;
nod c[NMmax];
char C;
int n,m,i,j,val,nr,nraux,sol;
int a[NMmax][NMmax];
int D[NMmax][NMmax];
const int dx[5]= {0,0,0,1,-1};
const int dy[5]= {0,1,-1,0,0};
inline void add(int x,int y,int val)
{
D[x][y]=val;
c[++nr].l=x;
c[nr].c=y;
c[nr].v=val;
}
void verif(nod crt,int x,int val)
{
if (crt.l==final.l && crt.c==final.c) sol=1;
if (sol) return;
a[crt.l][crt.c]=val;
for (int i=1; i<=4; ++i)
{
nod aux;
aux.l=crt.l+dx[i];
aux.c=crt.c+dy[i];
if (a[aux.l][aux.c]==0 && D[aux.l][aux.c]>=x)
verif(aux,x,val+1);
}
a[crt.l][crt.c]=0;
}
inline int cb()
{
int mij,st,dr;
st=1;
dr=n+m-1;
for (mij=(st+dr)>>1; st<=dr; mij=(st+dr)>>1)
{
sol=0;
verif(plecare,mij,1);
if (sol) st=mij+1;
else dr=mij-1;
}
return dr;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=n; ++i)
{
for (j=1; j<=m; ++j)
{
scanf("%c", &C);
if (C=='D')
{
a[i][j]=-2;
add(i,j,0);
continue;
}
if (C=='*')
{
a[i][j]=-1;
continue;
}
if (C=='I')
{
plecare.l=i;
plecare.c=j;
continue;
}
if (C=='O')
{
final.l=i;
final.c=j;
continue;
}
}
scanf("\n");
}
for (i=0; i<=n+1; ++i) a[i][0]=a[i][m+1]=-100;
for (j=0; j<=m+1; ++j) a[0][j]=a[n+1][j]=-100;
while (nraux<=nr)
{
i=c[nraux].l;
j=c[nraux].c;
val=c[nraux].v;
if (!D[i][j-1] && j-1>0) add(i,j-1,val+1);
if (!D[i][j+1] && j+1<=m) add(i,j+1,val+1);
if (!D[i-1][j] && i-1>0) add(i-1,j,val+1);
if (!D[i+1][j] && i+1<=n) add(i+1,j,val+1);
nraux++;
}
printf("%d\n", cb());
return 0;
}