#include <fstream>
#include <stdlib.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dx[8]={-1, -1, -1, 0, 0, 1, 1 ,1};
int dy[8]={-1, 0, 1, -1, 1, -1, 0, 1};
int di[4]={-1, 0, 0, 1};
int dj[4]={0, -1, 1, 0};
int n, m, i, j, a[1010][1010], b[1010][1010], x, h, xi, xf, yi, yf, maxim, c[2][100010];
int k;
char s[1010];
struct dragon{
int l, c;
} v[100010];
int lee(){
int p=1, u=1, i, j, ii, jj;
c[0][1]=xi;
c[1][1]=yi;
b[xi][yi]=-1;
while(p<=u)
{
i=c[0][p];
j=c[1][p];
for(int d=0; d<4; d++)
{
ii=i+di[d];
jj=j+dj[d];
if(ii>0 && ii<=n && jj>0 && jj<=m)
{
if(b[ii][jj]==2)
return 1;
if(b[ii][jj]==0)
{
u++;
c[0][u]=ii;
c[1][u]=jj;
b[ii][jj]=-1;
}
}
}
p++;
}
return 0;
}
int cb(int p, int u){
if(p>u)
{
g<<maxim+1<<"\n";
exit(0);
}
int l=(p+u)/2, nr=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
b[i][j]=a[i][j];
l--;
for(int i=1; i<=k; i++)
for(int d=0; d<8; d++)
{
int a1, a2;
a1=v[i].l+dx[d]*l;
a2=v[i].c+dy[d]*l;
//g<<a1<<' '<<a2<<" ";
if(a1<1)
a1=1;
else if(a1>n)
a1=n;
if(a2<1)
a2=1;
else if(a2>m)
a2=m;
//g<<a1<<' '<<a2<<"\n";
b[a1][a2]=4;
}
l++;
int aux=lee();
//g<<aux<<' '<<l<<"\n";
if(aux==1)
{
if(maxim<l)
maxim=l;
cb(l+1, u);
}
else
cb(p, l-1);
}
int main(){
f>>n>>m;
x=max(n, m);
for(i=1; i<=n; i++)
{
f.get();
f.get(s, 1010);
for(j=0; j<m; j++)
if(s[j]=='I')
{
a[i][j+1]=1;
xi=i;
yi=j;
}
else if(s[j]=='D')
{
a[i][j+1]=3;
k++;
v[k].l=i;
v[k].c=j;
}
else if(s[j]=='*')
a[i][j+1]=4;
else if(s[j]=='O')
{
a[i][j+1]=2;
xf=i;
yf=j;
}
}
maxim=-2;
cb(1, x);
return 0;
}