#include <fstream>
using namespace std;
FILE *fin = fopen("barbar.in" ,"r");
FILE *fout= fopen("barbar.out","w");
int n, m, i, j, k, ok, minim, maxim;
int a[1001][1001], b[3][1000001], d;
int diri[5] = {0,-1, 0, 1, 0};
int dirj[5] = {0, 0, 1, 0,-1};
int ic, jc, iv, jv, p, u, val;
int istart, jstart, ifin, jfin;
int c[1001][1001], dr, st, mid;
char x; int v;
void sol(){
fprintf(fout, "%d", dr);
return;
}
void fill(int ic, int jc, int val){
if(v == 1){
c[ic][jc] = 0;
return;
}
if(c[ic][jc] == 1)
return;
c[ic][jc] = 1;
if(ic >= 1 && ic <= n)
if(jc >= 1 && jc <= m)
if(a[ic][jc] != -1)
if(a[ic][jc] >= mid){
if(ic == ifin && jc == jfin){
ok = 1; v = 1;
}
else{
for(int d = 1; d <= 4; d ++){
int iv = ic + diri[d];
int jv = jc + dirj[d];
fill(iv, jv, val);
}
}
}
c[ic][jc] = 0;
return;
}
void bin(){
st = 1; dr = maxim;
while(st <= dr){
mid = (st + dr) / 2;
ok = 0; val = 0;
fill(istart, jstart, mid);
if(ok == 1)
st = mid + 1;
else
dr = mid - 1;
}
return;
}
void lee(){
while(p <= u){
ic = b[1][p]; jc = b[2][p];
for(d = 1; d <= 4; d ++){
iv = ic + diri[d];
jv = jc + dirj[d];
if(iv >= 1 && iv <= n)
if(jv >= 1 && jv <= m)
if(a[iv][jv] == 0){
u ++;
b[1][u] = iv;b[2][u] = jv;
a[iv][jv] = a[ic][jc] + 1;
if(a[iv][jv] > maxim)
maxim = a[iv][jv];
}
}
p ++;
}
return;
}
void read(){
fscanf(fin, "%d%d", &n, &m); p = 1;
for(i = 1; i <= n; i ++)
for(j = 1; j <= m; j ++){
fscanf(fin, "%s", &x);
if(x == 'I'){
istart = i;
jstart = j;
}
if(x == 'O'){
ifin = i;
jfin = j;
}
if(x == '*'){
a[i][j] = -1;
}
if(x == 'D'){
u ++;
b[1][u] = i;
b[2][u] = j;
}
}
return;
}
int main(){
read();lee();
bin(); sol();
return 0;
}