#include<fstream>
#include<queue>
#define inf 100000000
using namespace std;
ofstream g("barbar.out");
int i,j,n,m,a[1002][1002],d[1002][1002],b[1002][1002];
int xi,yi,xf,yf,rez=0,st,dr,mij;
struct nr
{
int x,y;
};
queue<nr> q;
char x;
int dx[]={-1,0,1,-0},dy[]={0,1,0,-1};
int verif(int x,int y)
{
return (x>0&&y>0&&x<=n&&y<=m);
}
void lee()
{
int k,xx,yy,ox,oy;
while(!q.empty())
{
xx=q.front().x;
yy=q.front().y;
for(k=0;k<4;++k)
{
ox=xx+dx[k];
oy=yy+dy[k];
if(a[xx][yy]+1<a[ox][oy]&&verif(ox,oy))
{
a[ox][oy]=a[xx][yy]+1;
q.push((nr) {ox,oy});
}
}
q.pop();
}
}
int lee1(int val)
{
int k,xx,yy,ox,oy;
q.push((nr) {xi,yi});
while(!q.empty())
{
xx=q.front().x;
yy=q.front().y;
for(k=0;k<4;++k)
{
ox=xx+dx[k];
oy=yy+dy[k];
if(a[ox][oy]>=val&&d[ox][oy]!=val&&a[ox][oy]!=-1&&verif(ox,oy))
{
d[ox][oy]=val;
q.push((nr) {ox,oy});
if(ox==xf&&oy==yf)
{
while(!q.empty())
q.pop();
return 1;
}
}
}
q.pop();
}
return 0;
}
int main()
{
ifstream f("barbar.in");
f>>n>>m;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
f>>x;
if(x=='D')
q.push((nr) {i,j}),a[i][j]=0;
if(x=='*')
a[i][j]=d[i][j]=-1;
if(x=='.')
a[i][j]=d[i][j]=inf;
if(x=='I')
xi=i,yi=j,d[i][j]=a[i][j]=inf;
if(x=='O')
xf=i,yf=j,d[i][j]=a[i][j]=inf;
}
lee();
/*for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
g<<a[i][j]<<" ";
g<<"\n";
}*/
st=1,dr=a[xf][yf];
while(st<dr)
{
mij=(st+dr)/2;
if(lee1(mij))
{
st=mij+1;
if(rez<=mij)
rez=mij;
}
else
dr=mij;
}
if(rez)
g<<rez;
else
g<<-1;
return 0;
}