///lee din dragoni,apoi caut binar distanta minima maxima si verific cu lee
///O(n*m*log(n*m))
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1e3+3;
int mat[NMAX][NMAX], aux[NMAX][NMAX], startlin, startcol, stoplin, stopcol;
///N E S V
int dirx[] = {-1, 0, 1, 0},
diry[] = {0, 1, 0, -1};
int n, m, starti, startj;
queue <pair <int, int> >coada;
bool ok(int lin, int col)
{
if(lin < 1 || lin > n)
return false;
if(col < 1 || col > n)
return false;
return true;
}
void lee()
{
int lin, col, i;
while(!coada.empty())
{
lin = coada.front().first;
col = coada.front().second;
coada.pop();
for(i = 0; i < 4; i++)
if(ok(lin + dirx[i], col + diry[i]) && mat[lin + dirx[i]][col + diry[i]] == 0)
{
mat[lin + dirx[i]][col + diry[i]] = mat[lin][col] + 1;
coada.push({lin + dirx[i], col + diry[i]});
}
}
}
int lee_barbar(int lim)
{
int lin, col, i, j;
for(i = 1; i <= n; ++i)
for(j = 1; j <= m; ++j)
{
if(aux[i][j] == -1)
aux[i][j] = -1;
else aux[i][j] = 0;
}
coada.push({startlin, startcol});
aux[startlin][startcol] = 1;
while(!coada.empty())
{
lin = coada.front().first;
col = coada.front().second;
coada.pop();
for(i = 0; i < 4; ++i)
if(ok(lin + dirx[i], col + diry[i]) && aux[lin + dirx[i]][col + diry[i]] == 0 && mat[lin + dirx[i]][col + diry[i]] >= lim)
{
aux[lin + dirx[i]][col + diry[i]] = mat[lin][col] + 1;
coada.push({lin + dirx[i], col + diry[i]});
}
}
return aux[stoplin][stopcol];
}
void sol()
{
int st = 1, dr = 10000000, mij, rasp;
while(st <= dr)
{
mij = (st + dr) / 2;
if(lee_barbar(mij))
rasp = mij, st = mij + 1;
else dr = mij - 1;
}
fout << rasp - 1;
}
int main()
{
char ch;
int i, j;
fin >> n >> m;
for(i = 1; i <= n; ++i)
for(j = 1; j <= m; ++j)
{
fin >> ch;
if(ch == 'D')
aux[i][j] = 0, mat[i][j] = 1, coada.push({i, j});
else if(ch == 'I')
aux[i][j] = 1, mat[i][j] = 0, startlin = i, startcol = j;
else if(ch == 'O')
aux[i][j] = 0, mat[i][j] = 0, stoplin = i, stopcol = j;
else if(ch == '*')
aux[i][j] = -1, mat[i][j] = -1;
else aux[i][j] = 0, mat[i][j] = 0;
}
lee();
sol();
return 0;
}