#include <iostream>

namespace {
// 色々設定
enum {
	MaxSize =1000	// 地図の大きさの最大値
};

enum {
	EmptySymbol = '.',	// 空白を示すシンボル
};

typedef unsigned int ScoreType; // 空白数を保持するための型, MaxSize*MaSizeに連動して変える

// 色々定義
template <class T>
T max(const T& A, const T& B){
	return (A > B) ? A : B;
}

template <class T>
T min(const T& A, const T& B){
	return (A < B) ? A : B;
}

template <class T>
T min(const T& A, const T& B, const T& C){
	return min(min(A, B), C);
}

// 空白か？
char isEmpty(const char& ch) {
	return (ch == EmptySymbol) ?  1 : 0;
}

} // unnamed namespace 

int main()
{
	unsigned char _map[MaxSize][MaxSize];
	const unsigned char (&map)[MaxSize][MaxSize] = _map; // なんとなく入力をconstにしたかった...
	ScoreType score[MaxSize][MaxSize];

	while (1) {
		int n;
		// データサイズ読み取り
		std::cin >> n;
		if (n == 0) { break; } // n==0ならば終了
		
		// データを読み取り
		for (int i=0; i<n; ++i) {
			std::cin >> _map[i];
		}

		// 一応, Width, Height
		const int Width  = n;
		const int Height = n;

		ScoreType max_score =0;
		// スコア計算(境界)
		for (int i=0; i<Height; ++i) {
			score[i][0] = isEmpty(map[i][0]);
			// 最大値を覚えておく
			max_score = max(max_score, score[i][0]);
		}
		for (int j=0; j<Width; ++j) {
			score[0][j] = isEmpty(map[0][j]);
			// 最大値を覚えておく
			max_score = max(max_score, score[0][j]);
		}
		
		// スコア計算(境界以外)
		for (int i=1; i<Height; ++i) {
			for (int j=1; j<Width; ++j) {
				// 更新ルール
				if (isEmpty(map[i][j])) {
					score[i][j] = min(score[i-1][j-1], score[i-1][j  ],
									  score[i  ][j-1]				   )+1;
				}else{
					score[i][j] = 0;
				}
				// 最大値を覚えておく
				max_score = max(max_score, score[i][j]);
			} // for (int j...)
		} // for (int i...)
		// 結果を出力
		std::cout << max_score << std::endl;
	} // while(1)
	return 0;
}