#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int dx[]={0,1,0,-1},dy[]={-1,0,1,0};
struct node{
int y,next,z;
}data[5500000],data1[160000];
int dis[440][440],flag[22*22],level[38000],h[38000],T,pe[440],d[440],dd,p,num,h1[22*22];
char s[22][22];int n,m;
inline void insert1(int x,int y,int z){
data1[++num].y=y;data1[num].z=z;data1[num].next=h1[x];h1[x]=num;
}
inline void insert(int x,int y,int z){
data[++num].y=y;data[num].z=z;data[num].next=h[x];h[x]=num;
data[++num].y=x;data[num].z=0;data[num].next=h[y];h[y]=num;
}
inline void bfs1(int u){
memset(flag,0,sizeof(flag));queue<int>q;flag[u]=1;q.push(u);dis[u][u]=0;
while (!q.empty()){
int x=q.front();q.pop();
for (int i=h1[x];i;i=data1[i].next){
int y=data1[i].y;if (!flag[y]) q.push(y),flag[y]=1,dis[u][y]=dis[u][x]+1;
}
}
}
inline bool bfs(){
memset(level,0,sizeof(level));queue<int> q;q.push(0);level[0]=1;
while (!q.empty()){
int x=q.front();q.pop();
for (int i=h[x];i;i=data[i].next){
int y=data[i].y,z=data[i].z;
if (level[y]||!z) continue;
level[y]=level[x]+1;q.push(y);if (y==T) return 1;
}
}return 0;
}
int dfs(int x,int s){
if (x==T) return s;int ss=s;
for (int i=h[x];i;i=data[i].next){
int y=data[i].y,z=data[i].z;
if (level[x]+1==level[y]&&z){
int xx=dfs(y,min(z,s));if (!xx) level[y]=0;
s-=xx;data[i].z-=xx;data[i^1].z+=xx;
if (!s) return ss;
}
}return ss-s;
}
inline int calc(int x,int y){return p+(x-1)*n*m+y;}
inline bool check(int mid){
memset(h,0,sizeof(h));num=1;
for (int i=1;i<=p;++i){
bool flag1=0;
for (int j=1;j<=dd;++j){
if (dis[pe[i]][d[j]]<=mid){
flag1=1;if (dis[pe[i]][d[j]]==inf) continue;
for (int k=dis[pe[i]][d[j]];k<=mid;++k) insert(i,calc(j,k),1);
}
}
if (!flag1) return false;
}int ans=0;T=p+dd*n*m+1;
for (int i=1;i<=p;++i) insert(0,i,1);
for (int i=1;i<=dd;++i)
for (int j=1;j<=n*m;++j) insert(calc(i,j),T,1);
// for (int i=2;i<=num;++i) printf("%d %d %d\n",data[i].x,data[i].y,data[i].z);
while (bfs()) ans+=dfs(0,inf);
if (ans==p) return 1;else return 0;
}
int main(){
freopen("","r",stdin);
scanf("%d%d",&n,&m);memset(dis,0x3f,sizeof(dis));
for (int i=1;i<=n;++i) scanf("%s",s[i]+1);
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
if (s[i][j]=='X'||s[i][j]=='D') continue;
for (int k=0;k<4;++k){
int x=i+dx[k],y=j+dy[k];
if (x<1||x>n||y<1||y>m) continue;
if (s[x][y]=='X') continue;
insert1((i-1)*m+j,(x-1)*m+y,1);
}
}
}
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
if (s[i][j]=='.') pe[++p]=(i-1)*m+j,bfs1(pe[p]);
if (s[i][j]=='D') d[++dd]=(i-1)*m+j;
}
}
int l=1,r=n*m;
while (l<=r){
int mid=l+r>>1;
if (check(mid)) r=mid-1;else l=mid+1;
}
if (l>n*m) printf("impossible\n");else printf("%d\n",l);
/*for (int i=1;i<=p;++i){
for (int j=1;j<=dd;++j) printf("%d %d %d\n",pe[i],d[j],dis[pe[i]][d[j]]);
printf("\n");
}*/
return 0;
}