#include <fstream>
using namespace std;
char v[1005][1005];
struct dragoni
{
int l,c;
}d[1000005];
int viz[1005][1005],ok=0,o=0,h=0,s;
int dfs(int dist, int x, int y, int a, int b)
{
viz[x][y]=1;
if(x==a && y==b)
ok=1;
if(ok==0)
{
o=0;
for(int i=0;i<h;i++)
{
s=0;
if(x+1>d[i].l)
s+=x+1-d[i].l;
else
s+=d[i].l-x-1;
if(y>d[i].c)
s+=y-d[i].c;
else
s+=d[i].c-y;
if(s<dist)
{
o=1;
break;
}
}
if(v[x+1][y]=='O' && o==0 && viz[x+1][y]==0)
dfs(dist, x+1, y, a, b);
else if(v[x+1][y]=='.' && o==0 && viz[x+1][y]==0)
{
dfs(dist, x+1, y, a, b);
}
o=0;
for(int i=0;i<h;i++)
{
s=0;
if(x-1>d[i].l)
s+=x-1-d[i].l;
else
s+=d[i].l-x+1;
if(y>d[i].c)
s+=y-d[i].c;
else
s+=d[i].c-y;
if(s<dist)
{
o=1;
break;
}
}
if(v[x-1][y]=='O' && o==0 && viz[x-1][y]==0)
dfs(dist, x-1, y, a, b);
else if(v[x-1][y]=='.' && o==0 && viz[x-1][y]==0)
{
dfs(dist, x-1, y, a, b);
}
o=0;
for(int i=0;i<h;i++)
{
s=0;
if(x>d[i].l)
s+=x-d[i].l;
else
s+=d[i].l-x;
if(y+1>d[i].c)
s+=y+1-d[i].c;
else
s+=d[i].c-y-1;
if(s<dist)
{
o=1;
break;
}
}
if(v[x][y+1]=='O' && o==0 && viz[x][y+1]==0)
dfs(dist, x, y+1, a, b);
else if(v[x][y+1]=='.' && o==0 && viz[x][y+1]==0)
{
dfs(dist, x, y+1, a, b);
}
o=0;
for(int i=0;i<h;i++)
{
s=0;
if(x>d[i].l)
s+=x-d[i].l;
else
s+=d[i].l-x;
if(y-1>d[i].c)
s+=y-1-d[i].c;
else
s+=d[i].c-y+1;
if(s<dist)
{
o=1;
break;
}
}
if(v[x][y-1]=='O' && o==0 && viz[x][y-1]==0)
dfs(dist, x, y-1, a, b);
else if(v[x][y-1]=='.' && o==0 && viz[x][y-1]==0)
{
dfs(dist, x, y-1, a, b);
}
}
return 0;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n,m,st=1,dr,mid,maxx=-1,x,y,a,b;
cin>>n>>m;
dr=n+m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>v[i][j];
if(v[i][j]=='I')
{
x=i;
y=j;
}
else if(v[i][j]=='O')
{
a=i;
b=j;
}
else if(v[i][j]=='D')
{
d[h].l=i;
d[h].c=j;
h++;
}
}
}
for(int i=0;i<=n+1;i++)
{
v[i][0]=v[i][m+1]='*';
}
for(int i=0;i<=m+1;i++)
{
v[0][i]=v[n+1][i]=1;
}
while(st<=dr)
{
mid=(dr-st)/2+st;
ok=0;
o=0;
for(int i=0;i<h;i++)
{
s=0;
if(x>d[i].l)
s+=x-d[i].l;
else
s+=d[i].l-x;
if(y>d[i].c)
s+=y-d[i].c;
else
s+=d[i].c-y;
if(s<mid)
{
o=1;
break;
}
}
if(o==0)
{
dfs(mid, x, y, a, b);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
viz[i][j]=0;
}
}
}
if(ok==1)
{
maxx=mid;
st=mid+1;
}
else
dr=mid-1;
}
cout<<maxx;
return 0;
}