#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

struct punkt {
	int x = 0;
	int y = 0;
};

bool da_sie_przejechac(std::vector<std::string> mapa, int rozmiar) {
	int h = mapa.size();
	int w = mapa[0].size();
	for (int y = 0; y < h; y++) {
		int ostatnia_przeszkoda = -1;
		for (int x = 0; x < w; x++) {
			if (mapa[y][x] == 'X')
				ostatnia_przeszkoda = x;
			else if (x - ostatnia_przeszkoda < rozmiar)
				mapa[y][x] = 'X';
		}
	}
	for (int x = 0; x < w; x++) {
		int ostatnia_przeszkoda = -1;
		for (int y = 0; y < h; y++) {
			if (mapa[y][x] == 'X')
				ostatnia_przeszkoda = y;
			else if (y - ostatnia_przeszkoda < rozmiar)
				mapa[y][x] = 'X';
		}
	}
	if (mapa[h - 1][rozmiar - 1] == 'X' || mapa[rozmiar - 1][w - 1] == 'X')
		return false;
	std::vector<punkt> stos {{rozmiar - 1, h - 1}};
	mapa[h - 1][rozmiar - 1] = 'X';
	while (!stos.empty()) {
		punkt pozycja = stos.back();
		stos.pop_back();
		if (pozycja.x + 1 < w && mapa[pozycja.y][pozycja.x + 1] != 'X') {
			stos.push_back({pozycja.x + 1, pozycja.y});
			mapa[pozycja.y][pozycja.x + 1] = 'X';
		}
		if (pozycja.x - 1 >= 0 && mapa[pozycja.y][pozycja.x - 1] != 'X') {
			stos.push_back({pozycja.x - 1, pozycja.y});
			mapa[pozycja.y][pozycja.x - 1] = 'X';
		}
		if (pozycja.y + 1 < h && mapa[pozycja.y + 1][pozycja.x] != 'X') {
			stos.push_back({pozycja.x, pozycja.y + 1});
			mapa[pozycja.y + 1][pozycja.x] = 'X';
		}
		if (pozycja.y - 1 >= 0 && mapa[pozycja.y - 1][pozycja.x] != 'X') {
			stos.push_back({pozycja.x, pozycja.y - 1});
			mapa[pozycja.y - 1][pozycja.x] = 'X';
		}
	}
	return mapa[rozmiar - 1][w - 1] == 'X';
}

int main() {
	int w, h;
	std::cin >> w >> h;
	std::vector<std::string> mapa(h);
	for (int i = 0; i < h; i++) {
		std::cin >> mapa[i];
	}
	int a = 1;
	int b = std::min(w, h);
	while (a < b) {
		int srednia = (a + b + 1) / 2;
		if (da_sie_przejechac(mapa, srednia))
			a = srednia;
		else
			b = srednia - 1;
	}
	std::cout << a;
	return 0;
}