#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,minim;
char c;
int m[MAX][MAX],best[MAX][MAX];
int di[4]={ 1,-1, 0, 0};
int dj[4]={ 0, 0, 1,-1};
pozitie poz[MAX*MAX];
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;
}
}
}
int nrd=u;
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;
}
}
}
for(i=1;i<=nrd;i++)
{
m[poz[i].i][poz[i].j]=0;
}
poz[1].i=istart;
poz[1].j=jstart;
p=0;
u=1;
best[istart][jstart]=m[istart][jstart];
while(p<u)
{
p++;
i=poz[p].i;
j=poz[p].j;
for(int l=0;l<=3;l++)
{
if(m[i+di[l]][j+dj[l]]>0)
{
minim=min(best[i][j],m[i+di[l]][j+dj[l]]);
if(minim>best[i+di[l]][j+dj[l]])
{
poz[++u].i=i+di[l];
poz[u].j=j+dj[l];
best[poz[u].i][poz[u].j]=minim;
}
}
}
}
if(best[ifinal][jfinal]==0)
{
best[ifinal][jfinal]=-1;
}
cout<<best[ifinal][jfinal];
return 0;
}