#include<iostream>
using namespace std;
int data[51][51];
int vis[51][51];
int roomnum;
int maxroom;
int m,n;
typedef struct node
{
int x;
int y;
}node;
node queue[1000];
int sum;
void bfs(int x, int y)
{
sum=0;
int tail,head;
head=tail=0;
vis[x][y]=1;
node startnode;
startnode.x=x;
startnode.y=y;
queue[tail++]=startnode;
sum++;
while(head!=tail)
{
node cur,next;
cur=queue[head++];
if(!(data[cur.x][cur.y]&1)&&cur.y-1>=0&&vis[cur.x][cur.y-1]==0)
{
next.x=cur.x;
next.y=cur.y-1;
vis[next.x][next.y]=1;
queue[tail++]=next;
sum++;
}
if(!(data[cur.x][cur.y]&2)&&cur.x-1>=0&&vis[cur.x-1][cur.y]==0)
{
next.x=cur.x-1;
next.y=cur.y;
vis[next.x][next.y]=1;
queue[tail++]=next;
sum++;
}
if(!(data[cur.x][cur.y]&4)&&cur.y+1<n&&vis[cur.x][cur.y+1]==0)
{
next.x=cur.x;
next.y=cur.y+1;
vis[next.x][next.y]=1;
queue[tail++]=next;
sum++;
}
if(!(data[cur.x][cur.y]&8)&&cur.x+1<m&&vis[cur.x+1][cur.y]==0)
{
next.x=cur.x+1;
next.y=cur.y;
vis[next.x][next.y]=1;
queue[tail++]=next;
sum++;
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
cin>>m>>n;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>data[i][j];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
vis[i][j]=0;
maxroom=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(vis[i][j]==0)
{
bfs(i,j);
if(sum>maxroom)
maxroom=sum;
roomnum++;
}
}
}
cout<<roomnum<<endl;
cout<<maxroom<<endl;
return 0;
}