//bfs从第一个区块里找到所有点,并且将所有点设为true.再猛猛遍历,只要是x而且不是true的点,就和队列里面所有的点都比对一边那啥曼哈顿系数,最后输出最小的就好了;
import java.util.;
import java.io.;
public class Main{
static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
static Scanner sc=new Scanner(System.in);
static int n,m;
static char map[][]=new char[1000][1000];
static int qx[]=new int[100010];
static int qy[]=new int[100010];
static boolean st[][]=new boolean[1000][1000];
static int mx[]= {1,0,-1,0};
static int my[]= {0,1,0,-1};
static int h1=0,t1=0;
public static void bfs(int o,int p) {
qx[0]=o;
qy[0]=p;
st[o][p]=true;
while(h1<=t1) {
int a=qx[h1];
int b=qy[h1];
h1++;
for(int i=0;i<4;i++) {
int x=a+mx[i];
int y=b+my[i];
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]=='X'&&!st[x][y]) {
st[x][y]=true;
t1++;
qx[t1]=x;
qy[t1]=y;
}
}
}
}
public static void main(String[]args)throws Exception{
n=sc.nextInt();
m=sc.nextInt();
sc.nextLine();
int o=0,p=0;
for(int i=0;i<n;i++) {
String str=sc.nextLine();
for(int j=0;j<m;j++) {
map[i][j]=str.charAt(j);
}
}
boolean a=false;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(map[i][j]=='X') {
bfs(i,j);
a=true;
break;
}
}
if(a) {
break;
}
}
int min=321321;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(!st[i][j]&&map[i][j]=='X') {
for(int k=0;k<=t1;k++) {
int t=Math.abs(qx[k]-i)+Math.abs(qy[k]-j)-1;
if(min>=t) {
min=t;
}
}
}
}
}
System.out.println(min);
}
}