#include<iostream>
#include<algorithm>
using std::cout;
using std::cin;
using std::endl;
struct Room
{
bool west, north, east, south;
int number;
} room[52][52];
struct Break
{
int size, row, column;
char location;
}breakwall[10005];
int n, m, list[2505], row, column, bigflag = 0;
char location;
void decode(Room& temproom, int& codedwall)
{
if (codedwall & 8)
temproom.south = true;
if (codedwall & 4)
temproom.east = true;
if (codedwall & 2)
temproom.north = true;
if (codedwall & 1)
temproom.west = true;
}
void mark(int i, int j, int k)
{
room[i][j].number = k;
if (!room[i][j].east && !room[i][j + 1].number)
mark(i, j + 1, k);
if (!room[i][j].south && !room[i + 1][j].number)
mark(i + 1, j, k);
if (!room[i][j].north && !room[i - 1][j].number)
mark(i - 1, j, k);
if (!room[i][j].west && !room[i][j - 1].number)
mark(i, j - 1, k);
}
int count(void)
{
int k = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (!room[i][j].number)
{
mark(i, j, k);
k++;
}
return k - 1;
}
void marksize(void)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
list[room[i][j].number]++;
}
int findmax(int num)
{
int max = 0;
for (int i = 0; i <= num; i++)
if (list[i] > max)
max = list[i];
return max;
}
int wall(void)
{
int k = 0;
for (int j = 1; j <= m; j++)
for (int i = n; i > 0; i--)
{
if (room[i][j].north && room[i][j].number != room[i - 1][j].number)
{
breakwall[k].row = i;
breakwall[k].column = j;
breakwall[k].location = 'N';
breakwall[k].size = list[room[i][j].number] + list[room[i - 1][j].number];
k++;
}
if (room[i][j].east && room[i][j].number != room[i][j + 1].number)
{
breakwall[k].row = i;
breakwall[k].column = j;
breakwall[k].location = 'E';
breakwall[k].size = list[room[i][j].number] + list[room[i][j + 1].number];
k++;
}
}
return k;
}
int sudofindmax(int num)
{
int max = 0, temp = 0;
for (int i = 0; i <= num; i++)
if (breakwall[i].size > max)
{
max = breakwall[i].size;
temp = i;
}
return temp;
}
int main()
{
int num, num2;
cin >> m >> n;
for (int i = 1; i <= n; i++)
for (int j = 1, codedwall; j <= m; j++)
{
cin >> codedwall;
decode(room[i][j], codedwall);
}
num = count();
cout << num << endl;
marksize();
cout << findmax(num) << endl;
num = wall();
num2 = sudofindmax(num);
cout << breakwall[num2].size << endl << breakwall[num2].row << ' ' << breakwall[num2].column << ' ' << breakwall[num2].location << endl;
return 0;
}