#include <bits/stdc++.h>
using namespace std;
#define cin fin
#define cout fout
int n, m, mt[251][251], mp[251][251];
char mc[251][251];
queue<pair<int, int>> Q;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
ifstream cin("barbar.in");
ofstream cout("barbar.out");
void Lee_DistMin() {
while (!Q.empty()) {
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for (int k = 0; k < 4; k++) {
int iv = i + dx[k];
int jv = j + dy[k];
if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && mt[iv][jv] != -1 && mt[iv][jv] != 0 && mt[iv][jv] > mt[i][j] + 1) {
mt[iv][jv] = mt[i][j] + 1;
Q.push(make_pair(iv, jv));
}
}
}
}
void Lee () {
while (!Q.empty()) {
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for (int k = 0; k < 4; ++k) {
int iv = i + dx[k];
int jv = j + dy[k];
if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && mt[iv][jv] != -1 && mt[iv][jv] != 0 && mp[iv][jv] < min(mp[i][j], mt[iv][jv])) {
Q.push(make_pair(iv,jv));
mp[iv][jv] = min(mp[i][j], mt[iv][jv]);
}
}
}
}
int main() {
cin >> n >> m;
int x, y, a, b;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> mc[i][j];
if (mc[i][j] == '.') {
mt[i][j] = 2e9;
} else if (mc[i][j] == '*') {
mt[i][j] = -1;
} else if (mc[i][j] == 'D') {
mt[i][j] = 0;
Q.push(make_pair(i, j));
} else if (mc[i][j] == 'O') {
x = i;
y = j;
mt[i][j] = 2e9;
} else if (mc[i][j] == 'I') {
mt[i][j] = 2e9;
a = i;
b = j;
}
}
}
Lee_DistMin();
Q.push({a, b});
mp[a][b] = mt[a][b];
Lee();
cout << mp[x][y];
return 0;
}