#include <cstdio>
using namespace std;
struct me{int l;int c;};
struct me2{int v;int ss;};
me cod[1000001];
me2 a[1001][1001];
int ok,lo,co,jm;
int dx[]={1,-1,0,0};
int dy[]={0,0,-1,1};
void pf(int x,int y,int m)
{
if(x==lo&&y==co)
ok=1;
a[x][y].ss=jm;
for(int i=0;i<=3;i++)
if(a[x+dx[i]][y+dy[i]].ss!=jm&&a[x+dx[i]][y+dy[i]].v>m)
pf(x+dx[i],y+dy[i],m);
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char x;
int n,m,i,j,li,ci,p=1,u=0,lin,col,st,dr,mij;
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&x);
if(x=='*')
a[i][j].v=-1;
if(x=='D')
a[i][j].v=1,u++,cod[u].l=i,cod[u].c=j;
if(x=='I')
li=i,ci=j;
if(x=='O')
lo=i,co=j;
}
scanf("\n");
}
for(i=0;i<=n+1;i++)
a[i][0].v=-1,a[i][m+1].v=-1;
for(j=0;j<=m+1;j++)
a[0][j].v=-1,a[n+1][j].v=-1;
while(p<=u)
{
lin=cod[p].l;
col=cod[p].c;
p++;
for(i=0;i<=3;i++)
if(a[lin+dx[i]][col+dy[i]].v==0)
{
u++;
a[lin+dx[i]][col+dy[i]].v=a[lin][col].v+1;
cod[u].l=lin+dx[i];
cod[u].c=col+dy[i];
}
}
st=1;
dr=2000;
jm=0;
while(st<=dr)
{
mij=(st+dr)/2;
ok=0;
jm++;
pf(li,ci,mij);
if(ok==0)
dr=mij-1;
else st=mij+1;
}
printf("%d",dr);
return 0;
}