#include <bits/stdc++.h>
using namespace std;
#define N 1003
char v[N+2][N+2];
int d[N+2][N+2];
bool f[N+2][N+2];
int dl[4]={-1, 0, 0, 1};
int dc[4]={0, -1, 1, 0};
bool ok(int mij, int n, int m, int l1, int c1, int l2, int c2){
int l,c,i,lin,col;
memset(f, 0, sizeof(f));
queue <pair <int, int> > q;
q.push(make_pair(l1, c1));
if (d[l1][c1]<mij)
return 0;
while (!q.empty()){
l=q.front().first;
c=q.front().second;
q.pop();
if (l==l2 && c==c2)
return 1;
for (i=0; i<4; i++){
lin=l+dl[i];
col=c+dc[i];
if (lin>0 && lin<=n && col>0 && col<=m && d[lin][col]>=mij && v[lin][col]!='*' && f[lin][col]==0){
f[lin][col]=1;
q.push(make_pair(lin, col));
}
}
}
return 0;
}
int main()
{
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
int n,m,i,j,l1,l2,c1,c2,l,c,lin,col,st,dr,mij;
cin >> n >> m;
cin.get();
for (i=1; i<=n; i++)
cin.getline(v[i]+1, N);
queue <pair <int, int> > q;
l1=l2=c1=c2=0;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++){
if (v[i][j]=='D'){
q.push(make_pair(i, j));
d[i][j]=1;
}
if (v[i][j]=='I'){
l1=i;
c1=j;
}
if (v[i][j]=='O'){
l2=i;
c2=j;
}
}
while (!q.empty()){
l=q.front().first;
c=q.front().second;
q.pop();
for (i=0; i<4; i++){
lin=l+dl[i];
col=c+dc[i];
if (lin>0 && lin<=n && col>0 && col<=m && d[lin][col]==0 && v[lin][col]!='*'){
d[lin][col]=d[l][c]+1;
q.push(make_pair(lin, col));
}
}
}
st=0;
dr=n*m;
while (st<=dr){
mij=(st+dr)/2;
if (ok(mij, n, m, l1, c1, l2, c2)==1)
st=mij+1;
else
dr=mij-1;
}
if (st==0)
cout << -1 << '\n';
else
cout << st-2 << '\n';
return 0;
}