#include <fstream>
#define MAX 1002
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
struct pozitie{
int i;
int j;
};
int n,mm,i,j,istart,jstart,ifinal,jfinal,u,p,dr,st,mij,ok,okk;
char c;
int m[MAX][MAX];
int di[4]={ 1,-1, 0, 0};
int dj[4]={ 0, 0, 1,-1};
pozitie poz[MAX*MAX];
void traseu (int dist, int i, int j)
{
if(i==ifinal && j==jfinal)
{
ok=1;
}
else if(ok==0)
{
for(int l=0;l<=3;l++)
{
if(m[i+di[l]][j+dj[l]]>=dist)
{
int x=m[i+di[l]][j+dj[l]];
m[i+di[l]][j+dj[l]]=-1;
traseu(dist,i+di[l],j+dj[l]);
m[i+di[l]][j+dj[l]]=x;
}
}
}
}
int main()
{
cin>>n>>mm;
for(i=1;i<=n;i++)
{
for(j=1;j<=mm;j++)
{
cin>>c;
if(c=='*')
{
m[i][j]=-1;
}
if(c=='I')
{
istart=i;
jstart=j;
}
if(c=='O')
{
ifinal=i;
jfinal=j;
}
if(c=='D')
{
m[i][j]=-1;
poz[++u].i=i;
poz[u].j=j;
}
}
}
for(i=1;i<=n;i++)
{
m[i][0]=-1;
m[i][n+1]=-1;
}
for(i=1;i<=mm;i++)
{
m[0][i]=-1;
m[n+1][i]=-1;
}
while(p<u)
{
p++;
i=poz[p].i;
j=poz[p].j;
int x=m[i][j];
if(x==-1)
{
x=0;
}
for(int l=0;l<=3;l++)
{
if(m[i+di[l]][j+dj[l]]==0)
{
poz[++u].i=i+di[l];
poz[u].j=j+dj[l];
m[poz[u].i][poz[u].j]=x+1;
}
}
}
dr=m[istart][jstart];
st=1;
while(st<=dr)
{
mij=(dr+st)/2;
ok=0;
traseu(mij,istart,jstart);
if(ok==1)
{
st=mij+1;
///cout<<".";
okk=1;
}
else
{
dr=mij-1;
///cout<<",";
}
}
mij=(st+dr)/2;
if(okk==0)
{
mij=-1;
}
cout<<mij;
return 0;
}