/*
 *	Eray Molla
 *
 *	Problem icin cesitli cozumler mevcut olmasina ragmen en verimli sonucu dinamik programlama ile elde
 *	ediyoruz. Kisaca algoritmamizi anlatacak olursak.
 *
 *	1 - Girdinin sol en tepesinden baslayarak iki boyutlu dizinin uzerinde gez
 *	2 - Uzerinde bulundugumuz karenin dahil olabilecegi ve en buyuk alanli dikdortgenleri kaydet.
 *		Bu dikdortgenler uzerinde bulundugumuz karenin:
 *		* ya hemen solundaki karenin ait oldugu en buyuk dikdortgene eklenmesiyle
 *		* ya hemen ustundeki karenin ait oldugu en buyuk dikdortgene eklenmesiyle
 *		* ya da sol ust caprazindaki karenin dahil oldugu en buyuk dikdortgene eklenmesiyle elde edilir.
 *		  (NOT: bu dikdortgenin de kenar uzunluklari solundaki kontrol edilir)
 *	3 - Eger elde edilen yeni dikdortgenin alani o ana kadarki en buyuk alanli dikdortgenden buyukse en buyuk olarak isaretle.
 *
 *
 *
 *
 *
 */





#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

#define GET_MIN(x, y) x > y ? y : x;
#define MAX_M 100		// maksimum M degeri
#define MAX_N 100		// maksimum N degeri
#define GIRDI_DOSYA "coban.gir"	// girdi dosyasinin adi
#define CIKTI_DOSYA "coban.cik"	// cikti dosyasinin adi


struct Dikdortgen
{
	int en;
	int boy;
	Dikdortgen(int _en, int _boy)
		:
			en(_en), boy(_boy)
	{}
};


struct Alan
{
	int yatay; // bir karenin kendiyle ayni satirdaki bos olan karelerle birlikte yapabildigi en uzun "en" uzunlugu
	int dikey; // bir karenin kendiyle ayni sutundaki bos olan karelerle birlikte yapabildigi en uzun "boy" uzunlugu
	vector<Dikdortgen> dikdortgenler; // karenin icinde bulunabilecegi dikdortgenler
};



int arazi[MAX_M + 2][MAX_N + 2];
int m, n;			// soruda verilen M ve N degerleri
Alan kareler[MAX_M + 2][MAX_N + 2];


void girdiOku()
{
	int okunanDeger;
	ifstream gir(GIRDI_DOSYA);
	gir >> m >> n;
	for(int y = 1; y <= m; y++)
		for(int x = 1; x <= n; x++)
		{
			gir >> okunanDeger;
			arazi[y][x] = okunanDeger;
		}
	gir.close();
}

// x sutunundaki ve y satirindaki karenin citle cevrilmeye uygun oldugunu kontrol et.
bool uygunMu(int x, int y)
{
	return (arazi[y][x] == 0) && (y == 1 || arazi[y - 1][x] == 0) &&  (y == m || arazi[y + 1][x] == 0) &&
		(x == 1 || arazi[y][x - 1] == 0) && (x == n || arazi[y][x + 1] == 0);
}

// en buyuklu dikdortgenin bilgileri
int maxDikdortgenSagAltX, maxDikdortgenSagAltY, maxDikdortgenEn, maxDikdortgenBoy, maxDikdortgenAlan;


void coz()
{
	int boyut, i;
	for(int y = 1; y <= m; y++)
		for(int x = 1; x <= n; x++)
		{
			if(uygunMu(x, y))
			{
				Alan& d = kareler[y][x];
				d.yatay = kareler[y][x - 1].yatay + 1;
				d.dikey = kareler[y - 1][x].dikey + 1;
				if(d.dikey == 1 && d.yatay == 1)
					d.dikdortgenler.push_back(Dikdortgen(1, d.dikey));
				else
				{
					if(d.dikey > 1)
						d.dikdortgenler.push_back(Dikdortgen(1, d.dikey));
					if(d.yatay > 1)
						d.dikdortgenler.push_back(Dikdortgen(d.yatay, 1));
				}
				Alan& capraz = kareler[y - 1][x - 1];
				// caprazin yatay'inin 0'dan buyuk olmasi buranin uygun oldugunu belirtir
				if(capraz.yatay > 0 && d.yatay > 1 && d.dikey > 1)
				{
					boyut = capraz.dikdortgenler.size();
					for(i = 0; i < boyut; i++)
					{
						int minYatay = GET_MIN(capraz.dikdortgenler[i].en, d.yatay);
						int minDikey = GET_MIN(capraz.dikdortgenler[i].boy, d.dikey);
						d.dikdortgenler.push_back(Dikdortgen(minYatay + 1, minDikey + 1));
					}
				}
				boyut = d.dikdortgenler.size();
				for(i = 0; i < boyut; i++)
				{
					int geciciEn = d.dikdortgenler[i].en;
					int geciciBoy = d.dikdortgenler[i].boy;
					int geciciAlan = geciciEn * geciciBoy;
					if(geciciAlan > maxDikdortgenAlan)
					{
						maxDikdortgenSagAltX = x;
						maxDikdortgenSagAltY = y;
						maxDikdortgenEn = geciciEn;
						maxDikdortgenBoy = geciciBoy;
						maxDikdortgenAlan = geciciAlan;
					}
				}
			}
		}
}



void ciktiYaz()
{
	ofstream cik(CIKTI_DOSYA);
	if(maxDikdortgenAlan == 0)
		cik << "SONUC YOK" << endl;
	else
	{
		cik << maxDikdortgenAlan << endl;
		cik << maxDikdortgenSagAltY - maxDikdortgenBoy + 1 << " " << maxDikdortgenSagAltX - maxDikdortgenEn + 1 << endl;
		cik << maxDikdortgenSagAltY << " " << maxDikdortgenSagAltX << endl;
	}
	cik.close();
}


int main()
{
	girdiOku();
	coz();
	ciktiYaz();
	return 0;
}
