#include <bits/stdc++.h>
#define maxN 1005
#define INF (1<<30)
using namespace std;
int n,i,j,jj,ii,m,xs,ys,xf,yf;
int dr[maxN][maxN];
int d[maxN][maxN];
int a[maxN][maxN];
char s[maxN];
bool ok;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
deque<pair<int,int> > q;
inline bool cont(int x,int y)
{
if(x>0 && x<=n && y>0 && y<=m)
return true;
return false;
}
void lee(int a[maxN][maxN])
{
int x,y;
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop_front();
for(int k=0;k<4;k++)
{
if(cont(x+dx[k],y+dy[k]))
if(a[x+dx[k]][y+dy[k]]!=-1 && a[x+dx[k]][y+dy[k]]>a[x][y]+1)
a[x+dx[k]][y+dy[k]]=a[x][y]+1,q.push_back(make_pair(x+dx[k],y+dy[k]));
}
}
}
void Lee(int a[maxN][maxN])
{
int x,y;
a[xs][ys]=dr[xs][ys];
while(!q.empty())
{
x=q.front().first;
y=q.front().second;
q.pop_front();
for(int k=0;k<4;k++)
{
if(cont(x+dx[k],y+dy[k]))
if(a[x+dx[k]][y+dy[k]]!=-1 && min(a[x][y],dr[x+dx[k]][y+dy[k]])>a[x+dx[k]][y+dy[k]])
a[x+dx[k]][y+dy[k]]=min(a[x][y],dr[x+dx[k]][y+dy[k]]),q.push_back(make_pair(x+dx[k],y+dy[k]));
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
{
gets(s+1);
for(j=1;j<=m;j++)
{
if(s[j]=='.')
dr[i][j]=INF,d[i][j]=0;
if(s[j]=='*')
dr[i][j]=-1,d[i][j]=-1;
if(s[j]=='D')
d[i][j]=-1,q.push_back(make_pair(i,j));
if(s[j]=='I')
dr[i][j]=INF,xs=i,ys=j;
if(s[j]=='O')
xf=i,yf=j,dr[i][j]=INF;
}
}
lee(dr);
q.push_back(make_pair(xs,ys));
Lee(d);
if(!d[xf][yf])
printf("-1");
else printf("%d",d[xf][yf]);
return 0;
}