#include <bits/stdc++.h>
#define REP(i,n) for (int i = 0; i <(n); ++i)
#define ALL(v) v.begin(), v.end()
using namespace std;

//入力
int h, w;
//DPテーブル
int dp[1400][1400]; //dp[h][w]　現在の位置を右下とした正方形の最大の面積
//タイルの汚れの有無
int G[1400][1400];


int main() {

  //input
  cin >> h >> w;
  for(int i = 1; i <= h; ++i ){
    for(int j = 1; j <= w; ++j )cin >> G[i][j];
  }


  //DPの初期化
  REP(i,h) dp[i][0] = 0;
  REP(i,w) dp[0][i] = 0;
  int maxlenge = 0;  //最大のサイズ

  //DPループ

  for(int i = 1; i <= h; ++i){
    for(int j = 1; j <= w; ++j){
      if(G[i][j]){
        dp[i][j] = 0;
      }            //タイルが汚れている場合は強制的に０
      else{
        dp[i][j] = min({dp[i-1][j-1], dp[i-1][j], dp[i][j-1]})+1;//タイルがきれいな場合
        maxlenge = max(maxlenge, dp[i][j]);
      }
    }
  }
  cout << maxlenge*maxlenge << endl;

}

