#include <iostream>
using namespace std;
int southNorth, westEast;
int castle[55][55];
int vis[55][55];
int roomNum;
int roomSize;
int maxRoomSize=0;
//1表示西墙,2表示北墙,4表示东墙,8表示南墙
int goSouthNorth[4]={0,-1,0,1};
int goWestEast[4]={-1,0,1,0};
void init() {
//1、读数据
cin >> southNorth >> westEast;
for (int i = 1; i <= southNorth; i++) {
for (int j = 1; j <= westEast; j++) {
cin >> castle[i][j];
vis[i][j]=false;
}
}
//2、变量初始化
roomNum=0;
}
void print() {
cout<< southNorth <<" "<< westEast<<endl;
for (int i = 1; i <= southNorth; i++) {
for (int j = 1; j <= westEast; j++) {
cout<< castle[i][j]<<" ";
}
cout<<endl;
}
}
void printAns(){
cout<<roomNum<<endl<<maxRoomSize<<endl;
}
//把一个房间所有能访问的格子都给它访问了
void searchAll(int startH,int startW){
for(int i=0;i<4;i++){
//b1为true说明有墙,不能走
bool b1=(1<<i)&castle[startH][startW];
if(!b1){//如果没墙能走
int h1=startH+goSouthNorth[i];
int w1=startW+goWestEast[i];
//b2是不越界
bool b2= h1>=1&&h1<=southNorth&&w1>=1&&w1<=westEast;
if(b2&&!vis[h1][w1]){//如果不越界并且没有被访问过
vis[h1][w1]=true;
roomSize++;
if(roomSize>maxRoomSize) maxRoomSize=roomSize;
searchAll(h1,w1);
}
}
}
}
void search(){
for (int i = 1; i <= southNorth; i++) {
for (int j = 1; j <= westEast; j++) {
roomSize=0;
if(!vis[i][j]){
vis[i][j]=true;
roomNum++;
roomSize++;
//cout<<"roomNum:"<<"i="<<i<<" j="<<j<<endl;
searchAll(i,j);
}
}
}
}
int main() {
//freopen("1817in.txt","r",stdin);
init();
//print();
search();
printAns();
return 0;
}