#include <bits/stdc++.h>
using namespace std;
const int MAX_L = 1e3 + 5;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[MAX_L][MAX_L];
int dist[MAX_L][MAX_L];
char line[MAX_L];
void readData(int r, int c) {
int i, j;
for (i = 0; i < r; i++) {
fin.getline(line, MAX_L);
for (j = 0; j < c; j++)
a[i][j] = line[j];
}
}
struct Pos {
int i;
int j;
};
queue<Pos> que;
void fil(int i, int j, int r, int c) {
dist[i][j] = -1;
if (i - 1 >= 0 && dist[i - 1][j] == 0) {
dist[i - 1][j] = -1; fil(i - 1, j, r, c);
}
if (j - 1 >= 0 && dist[i][j - 1] == 0) {
dist[i][j - 1] = -1; fil(i, j - 1, r, c);
}
if (i + 1 < r && dist[i + 1][j] == 0) {
dist[i + 1][j] = -1; fil(i + 1, j, r, c);
}
if (j + 1 < c && dist[i][j + 1] == 0) {
dist[i][j + 1] = -1; fil(i, j + 1, r, c);
}
}
bool verif(int distVar, int r, int c) {
int i, j; Pos pos, first, last;
for (i = 0; i < r; i++)
for (j = 0; j < c; j++) {
dist[i][j] = 0;
if (a[i][j] == 'D') {
dist[i][j] = 1;
que.push({i, j});
}
}
while (!que.empty()) {
pos = que.front(); que.pop();
i = pos.i; j = pos.j;
if (dist[i][j] < distVar) {
if (i - 1 >= 0 && dist[i - 1][j] == 0) {
dist[i - 1][j] = dist[i][j] + 1;
que.push({i - 1, j});
}
if (j - 1 >= 0 && dist[i][j - 1] == 0) {
dist[i][j - 1] = dist[i][j] + 1;
que.push({i, j - 1});
}
if (i + 1 < r && dist[i + 1][j] == 0) {
dist[i + 1][j] = dist[i][j] + 1;
que.push({i + 1, j});
}
if (j + 1 < c && dist[i][j + 1] == 0) {
dist[i][j + 1] = dist[i][j] + 1;
que.push({i, j + 1});
}
}
}
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
if (a[i][j] == 'I')
first.i = i, first.j = j;
i = first.i, j = first.j;
fil(i, j, r, c);
/* for (i = 0; i < r; i++) {
for (j = 0; j < c; j++)
fout << dist[i][j] << ' ';
fout << '\n';
} */
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
if (a[i][j] == 'O')
last.i = i, last.j = j;
i = last.i, j = last.j;
return dist[i][j] == -1;
}
int main() {
int r, c;
int i, j;
int st, dr, mij;
fin >> r >> c;
fin.getline(line, MAX_L);
readData(r, c);
st = 0; dr = max(r, c);
while (dr - st > 1) {
mij = (st + dr) / 2;
if (verif(mij, r, c))
st = mij;
else
dr = mij;
}
fout << st;
return 0;
}