#include <iostream>
#include <cstdio>
#define inf 200000000
#include<string.h>
using namespace std;
int dx[]={0, 1, 0, -1};
int dy[]={1, 0, -1, 0};
int n,m,i,j,a[1005][1005],x1,y1,x2,y2,sc,mid,st,dr,sol;
struct coada
{
int l,c;
};
coada c[1100000];
bool ok,viz[1003][1003];
void citire()
{
int i,j,l;
char s[1005];
scanf("%d%d\n",&n,&m);
for (i=1; i<=n; i++)
{
scanf("%s\n",&s);
for (j=0; j<=m-1; j++)
if (s[j]=='I') {x1=i; y1=j+1; a[i][j+1]=inf;}
else if (s[j]=='O') {x2=i; y2=j+1; a[i][j+1]=inf;}
else if (s[j]=='D') { a[i][j+1]=0; sc++; c[sc].l=i; c[sc].c=j+1;}
else if (s[j]=='*') a[i][j+1]=-1;
else a[i][j+1]=inf;
}
}
void bordare()
{
int i,j;
for (i=0; i<=n+1; i++)
{
a[i][0]=-1;
a[i][m+1]=-1;
}
for (j=0; j<=m+1; j++)
{
a[0][j]=-1;
a[n+1][j]=-1;
}
}
int Lee()
{
int ic=1;
coada t,cx;
while (ic<=sc)
{
t=c[ic];
ic++;
for (i=0; i<=3; i++)
if (a[t.l+dx[i]][t.c+dy[i]]==inf)
{
cx.l=t.l+dx[i];
cx.c=t.c+dy[i];
a[cx.l][cx.c]=a[t.l][t.c]+1;
sc++;
c[sc].l=cx.l;
c[sc].c=cx.c;
}
}
}
bool bf(int x1, int y1, int x2, int y2, int mid)
{
int ic=1,sc=1;
if(a[x1][y1]<mid)
return 0;
memset(viz,0,sizeof(viz));
coada t,cx;
c[ic].l=x1;
c[ic].c=y1;
viz[x1][y1]=1;
while (ic<=sc)
{
t=c[ic];
ic++;
for (i=0; i<=3; i++)
if (a[t.l+dx[i]][t.c+dy[i]]>=mid&&viz[t.l+dx[i]][t.c+dy[i]]==0)
{
cx.l=t.l+dx[i];
cx.c=t.c+dy[i];
sc++;
c[sc].l=cx.l;
c[sc].c=cx.c;
viz[cx.l][cx.c]=1;
if(cx.l==x2&&cx.c==y2)
return 1;
}
}
return 0;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
citire();
bordare();
Lee();
st=0;
dr=max(m,n);
sol=-1;
while (st<=dr)
{
mid=(st+dr)/2;
ok=bf(x1,y1,x2,y2,mid);
if (ok==1)
{
sol=mid;
st=mid+1;
}
else dr=mid-1;
}
printf("%d\n",sol);
return 0;
}