#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void solve() {
int m, n;
while (cin >> m >> n) {
// 繼續保持 $O(N)$ 的極致省空間滾動陣列
vector<int> prev_dp(n, 0);
vector<int> curr_dp(n, 0);
int max_side = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
int val;
cin >> val;
if (val == 1) {
if (i == 0 || j == 0) {
curr_dp[j] = 1;
} else {
curr_dp[j] = min({curr_dp[j - 1], prev_dp[j], prev_dp[j - 1]}) + 1;
}
max_side = max(max_side, curr_dp[j]);
} else {
curr_dp[j] = 0;
}
}
prev_dp = curr_dp;
}
// 關鍵修正:題目要求的是「邊長」,而非面積!
cout << max_side << "\n";
}
}
int main() {
// 極速輸入輸出優化
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
solve();
return 0;
}