#include<iostream>
using namespace std;
int map[60][60];
int color[60][60]={0};
int n,m;
int t=0;
void dfs(int i,int j,int c);
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>map[i][j];
}
}
int c=0; //代表染色号
int num=0; //记录房间数量
int temp=0; //记录最大房间面积
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(color[i][j]==0){
c++;
t=0; //处理
dfs(i,j,c);
if(temp<t) temp=t;
num++; //房间数加1
}
}
}
cout<<num<<endl;
cout<<temp;
return 0;
}
void dfs(int i,int j,int c){
if(color[i][j]) return; //必须得加上,因为没有循环终止条件时,容易出现来回搜索生成死循环的情况
color[i][j]=c; //代表该块已经走过,给其染色
t++;
// cout<<i<<" "<<j<<" map:"<<map[i][j]<<" "<<(map[i][j]&1)<<" "<<(map[i][j]&2)<<" "<<(map[i][j]&4)<<" "<<(map[i][j]&8)<<endl;
//四周搜索下一个可行位置
if((map[i][j]&1)==0) dfs(i,j-1,c);
if((map[i][j]&2)==0) dfs(i-1,j,c);
if((map[i][j]&4)==0) dfs(i,j+1,c);
if((map[i][j]&8)==0) dfs(i+1,j,c);
}