#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <stack>
#include <queue>
#include <list>
#include <stdio.h>
#include <algorithm>
#define MAX 1400
#define INF 100000000
using namespace std;
typedef long long ll;
int g[MAX+1][MAX+1],dp[MAX+1][MAX+1];
int main()
{	
	int h,w,max_width=0;
	cin>>h>>w;
	for(int i=0;i<h;i++)
	{
		for(int j=0;j<w;j++)
		{
			scanf("%d",&g[i][j]);
		}
	} 
	for(int i=0;i<h;i++){
		for(int j=0;j<w;j++){
			dp[i][j]=(g[i][j]+1)%2;
			max_width|=dp[i][j];
		}
	}//初始化,每一个没被污染的点至少都能画出的宽度都是1 
	for(int i=1;i<h;i++)
	{
		for(int j=1;j<w;j++)
		{
			if(dp[i][j]==0) continue;
			dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
			max_width=max(dp[i][j],max_width);
		}
	}
	cout<<max_width*max_width<<endl;
}
