#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int d[1001][1001], dmin[1001][1001], dy[4] = {-1, 1, 0, 0}, dx[4] = {0, 0, -1, 1}, R, C, i, j, k, iy, ix, oy, ox;
char mat[1001][1001];
queue<pair<int, int>> q;
bool cond(int ky, int kx) {
return ky >= 0 && ky < R && kx >= 0 && kx < C && ( mat[ky][kx] != '*' && mat[ky][kx] != 'D' );
}
int main() {
fin >> R >> C;
for ( i = 0; i < R; i++ )
for ( j = 0; j < C; j++ ) {
fin >> mat[i][j];
if ( mat[i][j] == 'D' ) {
d[i][j] = 0;
q.push(make_pair(i, j));
} else {
d[i][j] = -1;
dmin[i][j] = -1;
}
if ( mat[i][j] == 'I' ) {
iy = i;
ix = j;
}
if ( mat[i][j] == 'O' ) {
oy = i;
ox = j;
}
}
while ( !q.empty() ) {
int y = q.front().first, x = q.front().second;
q.pop();
for ( k = 0; k < 4; k++ ) {
int ky = y + dy[k], kx = x + dx[k];
if ( cond(ky, kx) && d[ky][kx] == -1 ) {
d[ky][kx] = d[y][x] + 1;
q.push(make_pair(ky, kx));
}
}
}
q.push(make_pair(iy, ix));
dmin[iy][ix] = d[iy][ix];
while ( !q.empty() ) {
int y = q.front().first, x = q.front().second;
q.pop();
for ( k = 0; k < 4; k++ ) {
int ky = y + dy[k], kx = x + dx[k];
if ( cond(ky, kx) && dmin[ky][kx] < min(dmin[y][x], d[ky][kx]) ) {
dmin[ky][kx] = max(dmin[ky][kx], min(dmin[y][x], d[ky][kx]));
q.push(make_pair(ky, kx));
}
}
}
fout << dmin[oy][ox];
return 0;
}