#include <bits/stdc++.h>
using namespace std;
int dist[1001][1001], distd[1001][1001], n, m;
char mat[1001][1001];
int a1, a2, b1, b2;
vector<pair<int, int>> muie;
int di[]={-1, 0, 1, 0}, dj[]={0, -1, 0, 1};
bool check(int x, int y) {
if (x>0 && x<=n && y>0 && y<=m && mat[x][y]!='*') return true;
return false;
}
/*void lee(int a1, int a2) {
queue<pair<int, int>> q;
q.push({a1, a2});
dist[a1][a2] = 1;
while(!q.empty()) {
int i = q.front().first, j = q.front().second;
q.pop();
for(int k = 0; k < 4; k++) {
int x = i + di[k], y = j + dj[k];
if (check(x, y) && dist[x][y] > dist[i][j] + 1) {
dist[x][y] = dist[i][j]+1;
q.push({x, y});
}
}
}
}*/
void lee2() {
queue<pair<int, int>> q;
for (int i=0; i<muie.size(); i++) {
q.push({muie[i].first, muie[i].second});
distd[muie[i].first][muie[i].second] = 0;
}
while(!q.empty()) {
int i = q.front().first, j = q.front().second;
q.pop();
for(int k = 0; k < 4; k++) {
int x = i + di[k], y = j + dj[k];
if (check(x, y) && distd[x][y] > distd[i][j] + 1 ) {
distd[x][y] = distd[i][j]+1;
q.push({x, y});
}
}
}
}
bool verif(int d) {
for (int i=1; i<=n; i++)
for (int j=1; j<=m; j++)
dist[i][j]=-1;
if (distd[a1][a2]<d)
return false;
queue<pair<int, int>> q;
q.push({a1, a2});
dist[a1][a2] = 0;
while (!q.empty()) {
int i=q.front().first, j = q.front().second;
q.pop();
//cerr<<i<<" "<<j<<endl;
if (i==b1 && j==b2) {
//cerr<<endl;
return true;
}
for(int k = 0; k < 4; k++) {
int x=i+di[k], y=j+dj[k];
if (!check(x,y))
continue;
if (dist[x][y]!=-1)
continue;
if (distd[x][y] < d)
continue;
dist[x][y] = dist[i][j] + 1;
q.push({x, y});
}
}
//cerr<<endl;
return false;
}
int main() {
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin >> n >> m;
for (int i = 1; i<=n; i++) {
for (int j=1; j<=m; j++) {
cin >> mat[i][j];
if (mat[i][j]=='I') {
a1 = i; a2 = j;
}
else if (mat[i][j]=='D') {
muie.push_back({i, j});
}
else if (mat[i][j]=='O') {
b1=i; b2=j;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dist[i][j] = 2e9;
distd[i][j] = 2e9;
if (mat[i][j]=='*')
dist[i][j]=-1;
}
}
lee2();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
//cout<<distd[i][j]<<" ";
}
// cout<<endl;
}
// lee(a1, a2);
int st=0, dr=n*m, mij, poz=-1;
while (st<=dr) {
mij=(st+dr)/2;
//cerr<<mij<<":\n";
if (verif(mij)) {
st=mij+1;
poz=mij;
}
else
dr=mij-1;
}
cout << poz;
return 0;
}