#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int N, M;
queue < pair < int , int > > Q;
const int di[] = {-1, 0, 1, 0},
dj[] = {0, 1, 0, -1};
inline bool inside(int lin, int col) {
return lin > 0 && lin <= N && col > 0 && col <= M;
}
void Lee(vector < vector < int > >& a) {
while(!Q.empty()) {
int i = Q.front().first,
j = Q.front().second;
Q.pop();
for(int k = 0; k < 4; ++k) {
int iv = i + di[k],
jv = j + dj[k];
if(inside(iv, jv) && a[iv][jv] == 0) {
a[iv][jv] = a[i][j] + 1;
Q.emplace(iv, jv);
}
}
}
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M; ++j)
--a[i][j];
}
int main() {
fin >> N >> M;
vector < string > grid(N + 1);
vector < vector < int > > d_min(N + 1, vector < int >(M + 1)), a(N + 1, vector < int >(M + 1));
int istart = -1, jstart = -1, istop = -1, jstop = -1;
for(int i = 1; i <= N; ++i) {
fin >> grid[i];
grid[i] = '0' + grid[i];
for(int j = 1; j <= M; ++j) {
if(grid[i][j] == 'D') {
Q.emplace(i, j);
d_min[i][j] = 1;
}
if(grid[i][j] == '*' || grid[i][j] == 'D')
a[i][j] = -1;
if(grid[i][j] == 'I') {
istart = i;
jstart = j;
}
if(grid[i][j] == 'O') {
istop = i;
jstop = j;
}
}
}
Lee(d_min);
int st = 1, dr = N * M, ans = -1;
while(st <= dr) {
int mid = (st + dr) >> 1;
if(d_min[istart][jstart] >= mid)
Q.emplace(istart, jstart);
a[istart][jstart] = 1;
while(!Q.empty()) {
int i = Q.front().first,
j = Q.front().second;
Q.pop();
for(int k = 0; k < 4; ++k) {
int iv = i + di[k],
jv = j + dj[k];
if(inside(iv, jv) && a[iv][jv] == 0 && d_min[iv][jv] >= mid) {
Q.emplace(iv, jv);
a[iv][jv] = 1;
}
}
}
if(a[istop][jstop] > 0) {
ans = mid;
st = mid + 1;
}
else
dr = mid - 1;
for(int i = 1; i <= N; ++i)
for(int j = 1; j <= M; ++j)
if(a[i][j] > 0)
a[i][j] = 0;
}
fout << ans;
}