#include <iostream>
#include <fstream>
#include <queue>
#include <iomanip>
using namespace std;
#define MAX 1005
ifstream fin("barbar.in");
ofstream fout("barbar.out");
queue < pair < int , int > > coada;
int a[MAX][MAX];
bool viz[MAX][MAX];
int main()
{
int n,m,i,j,x1,x2,y1,y2;
char x;
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>x;
if(x=='.')
a[i][j]=0;
if(x=='D'){
a[i][j]=0;
coada.push(make_pair(i,j));
viz[i][j]=1;
}
if(x=='I'){
x1=i;
y1=j;
}
if(x=='O'){
x2=i;
y2=j;
}
if(x=='*')
a[i][j]=-1;
}
for(i=0;i<=n;i++)
a[i][0]=a[i][n+1]=-1;
for(i=0;i<=m;i++)
a[0][i]=a[m+1][i]=-1;
while(!coada.empty())
{
i=coada.front().first;
j=coada.front().second;
coada.pop();
viz[i][j]=1;
if(!a[i-1][j]&&(!viz[i-1][j])){
coada.push(make_pair(i-1,j));
a[i-1][j]=a[i][j]+1;
}
if(!a[i+1][j]&&(!viz[i+1][j])){
coada.push(make_pair(i+1,j));
a[i+1][j]=a[i][j]+1;
}
if(!a[i][j-1]&&(!viz[i][j-1])){
coada.push(make_pair(i,j-1));
a[i][j-1]=a[i][j]+1;
}
if(!a[i][j+1]&&(!viz[i][j+1])){
coada.push(make_pair(i,j+1));
a[i][j+1]=a[i][j]+1;
}
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
viz[i][j]=0;
coada.push(make_pair(x1,y1));
int k,ok=1;
k=a[x1][x2]+1;
while(ok){
k--;
while(!coada.empty())
{
i=coada.front().first;
j=coada.front().second;
coada.pop();
viz[i][j]=1;
if(a[i-1][j]>=k&&(!viz[i-1][j]))
coada.push(make_pair(i-1,j));
if(a[i+1][j]>=k&&(!viz[i+1][j]))
coada.push(make_pair(i+1,j));
if(a[i][j-1]>=k&&(!viz[i][j-1]))
coada.push(make_pair(i,j-1));
if(a[i][j+1]>=k&&(!viz[i][j+1]))
coada.push(make_pair(i,j+1));
}
ok=1;
if(viz[x2][y2])
ok=0;
}
fout<<k<<endl;
return 0;
}