#include <iostream>
#include <cstring>
using namespace std;
int parent[3000];
int find(int x) //寻找根节点 和 路径压缩
{
if(parent[x]<0) return x;
parent[x]=find(parent[x]);
return parent[x];
}
void uni(int x,int y) //集合合并
{
int root1,root2,t;
root1=find(x);
root2=find(y);
if(root1==root2) return;
t=parent[root1]+parent[root2];
if(parent[root1]<parent[root2])
{
parent[root2]=root1;
parent[root1]=t;
}
else
{
parent[root1]=root2;
parent[root2]=t;
}
}
int main ()
{
int n,m,sum,a[3000];
while (cin>>n>>m)
{
memset(parent,-1,sizeof(parent));
sum = n * m;
for (int i = 1; i <= sum; i++)
{
cin>>a[i];
if (!(a[i] & 1))
{
if (i%m - 1 > 0) uni(i,i-1);
}
a[i] /= 2;
if (!(a[i] & 1))
{
if (i > m) uni(i,i-m);
}
a[i] /= 2;
if (!(a[i] & 1))
{
if (i%m != 0) uni(i,i+1);
}
a[i] /= 2;
if (!(a[i] & 1))
{
if (i+m <= sum) uni(i,i+m);
}
}
int max = -1,ans = 0;
for (int i = 1; i <= sum; i++)
{
if (parent[i]*-1 > max) max = parent[i]*-1;
if (parent[i] < 0) ans ++;
}
cout<<ans<<endl;
cout<<max<<endl;
}
return 0;
}