#include <fstream>
using namespace std;
char ch[1005][1005];
int X[1000005],Y[1000005],dmin[1005][1005];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int n,m,x1,y1,x2,y2,cnt;
int interior(int a,int b)
{
return a>0 && b>0 && a<=n && b<=m;
}
int uV[1005][1005];
void flood(int x,int y,int dist)
{
if(interior(x,y)==0 || uV[x][y]!=0 || dmin[x][y]<dist)
return;
else
{
uV[x][y]=1;
}
flood(x+1,y,dist);
flood(x-1,y,dist);
flood(x,y+1,dist);
flood(x,y-1,dist);
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>ch[i][j];
if(ch[i][j]=='I')
x1=i,y1=j;
else if(ch[i][j]=='O')
x2=i,y2=j;
else if(ch[i][j]=='D')
{
cnt++;
dmin[i][j]=1;
X[cnt]=i;
Y[cnt]=j;
}
}
int st=1,dr=cnt;
while(st<=dr)
{
for(int k=0;k<4;k++)
{
int nx=X[st]+dx[k],ny=Y[st]+dy[k];
if(interior(nx,ny)==1 && (ch[nx][ny]!='*') && dmin[nx][ny]==0)
{
dmin[nx][ny]=dmin[X[st]][Y[st]]+1;
dr++;
X[dr]=nx;
Y[dr]=ny;
}
}
st++;
}
st=1,dr=2000;
int retin=0;
while(st<=dr)
{
int mij=(st+dr)/2;
flood(x1,y1,mij);
if(uV[x2][y2]==1)
{
retin=mij;
st=mij+1;
}
else
dr=mij-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
uV[i][j]=0;
}
cout<<retin-1;
return 0;
}