#include <bits/stdc++.h>
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
bool Interior(int i, int j, int N, int M)
{
if(i <= 0 || i > N) return false;
if(j <= 0 || j > M) return false;
return true;
}
void LEE(std::queue<std::pair<int, int>>& q, std::vector<std::vector<int>>& L)
{
int n = L.size() - 1;
int m = L[0].size() - 1;
while(!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int l = 0; l < 4; l++)
{
int xx = x + dx[l];
int yy = y + dy[l];
if(Interior(xx, yy, n, m) && L[xx][yy] > 0 && L[xx][yy] > L[x][y] + 1)
{
L[xx][yy] = L[x][y] + 1;
q.push({xx, yy});
}
}
}
}
bool Verifica(int limita, std::pair<int, int> start, std::pair<int, int> finish, const std::vector<std::vector<int>>& L, int N, int M)
{
if (L[start.first][start.second] < limita || L[finish.first][finish.second] < limita) return false;
std::queue<std::pair<int, int>> q;
std::vector<std::vector<bool>> viz(N + 1, std::vector<bool>(M + 1, false));
q.push(start);
viz[start.first][start.second] = true;
while(!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
if (x == finish.first && y == finish.second) return true;
for(int l = 0; l < 4; l++)
{
int xx = x + dx[l];
int yy = y + dy[l];
if (Interior(xx, yy, N, M) && !viz[xx][yy] && L[xx][yy] >= limita)
{
viz[xx][yy] = true;
q.push({xx, yy});
}
}
}
return false;
}
int main()
{
std::ifstream fin("barbar.in");
std::ofstream fout("barbar.out");
int N{}, M{}, i{}, j{};
fin >> N >> M;
std::vector<std::vector<int>> L(N+1, std::vector<int>(M+1));
std::string s;
std::queue<std::pair<int, int>> q;
std::pair<int, int> start{}, finish{};
for(i = 1; i <= N; i++)
{
fin >> s;
for(j = 0; j < M; j++)
{
if(s[j] == '.') L[i][j + 1] = 2e9;
else if(s[j] == 'D')
{
L[i][j + 1] = 0;
q.push({i, j + 1});
}
else if(s[j] == '*') L[i][j + 1] = -1;
else if(s[j] == 'I')
{
start = {i, j + 1};
L[i][j + 1] = 2e9;
}
else if(s[j] == 'O')
{
finish = {i, j + 1};
L[i][j + 1] = 2e9;
}
}
}
LEE(q, L);
int st = 0;
int dr = N + M;
int ans = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if (Verifica(mij, start, finish, L, N, M))
{
ans = mij;
st = mij + 1;
}
else dr = mij - 1;
}
fout << ans << "\n";
fin.close();
fout.close();
return 0;
}