#include <fstream>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int R, C, temnita[1005][1005], temnita_de_scriere[1005][1005], distante_dragoni[1005][1005], contor_dragoni;
struct coord
{
int linie, col;
};
queue<coord> coada;
coord dragoni[1005], finish, erou;
bool este_in_mat(int linie, int col)
{
return (0 <= linie && linie < R && 0 <= col && col < C);
}
void Lee(int distante[1000][1000], int limita_dist)
{
while (!coada.empty())
{
int dirLinie[4] = {-1, 1, 0, 0};
int dirCol[4] = {0, 0, -1, 1};
coord curent = coada.front();
coada.pop();
for (int i = 0; i < 4; i++)
{
coord vecin;
vecin.linie = curent.linie + dirLinie[i];
vecin.col = curent.col + dirCol[i];
if (este_in_mat(vecin.linie, vecin.col) && temnita[vecin.linie][vecin.col] == 0 && distante[vecin.linie][vecin.col] == 0 && distante_dragoni[vecin.linie][vecin.col] > limita_dist)
{
coada.push(vecin);
distante[vecin.linie][vecin.col] = distante[curent.linie][curent.col] + 1;
}
}
}
}
void calc_distante_dragoni()
{
for (int i = 0; i < contor_dragoni; i++)
{
coada.push(dragoni[i]);
distante_dragoni[dragoni[i].linie][dragoni[i].col] = 1;
}
Lee(distante_dragoni, -1);
}
int rezolvare()
{
int rasp = -1, st = 0, dr = 1000000;
while (st <= dr)
{
memset(temnita_de_scriere, 0, sizeof temnita_de_scriere);
int mid = (st + dr) / 2;
coada.push(erou);
temnita_de_scriere[erou.linie][erou.col] = 1;
Lee(temnita_de_scriere, mid);
if (temnita_de_scriere[finish.linie][finish.col] != 0)
{
rasp = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
return rasp;
}
int main()
{
fin >> R >> C;
string linie;
getline(fin, linie);
for (int i = 0; i < R; i++)
{
string caractere;
getline(fin, caractere);
for (int j = 0; j < C; j++)
{
if (caractere[j] == 'I')
{
erou.linie = i;
erou.col = j;
}
else if (caractere[j] == 'D')
{
temnita[i][j] = -1;
coord dragon;
dragon.linie = i;
dragon.col = j;
dragoni[contor_dragoni++] = dragon;
}
else if (caractere[j] == '*')
temnita[i][j] = -1;
else if (caractere[j] == 'O')
{
finish.linie = i;
finish.col = j;
}
}
}
calc_distante_dragoni();
int raspuns = rezolvare();
fout << raspuns << "\n";
return 0;
}