#include <iostream>
using namespace std;
int m, n, num[50][50];
int judge(int x, int y) {
//判断边界
if(x < 0 || x >= m || y < 0 || y >= n || num[x][y] == -1) return 0;
int pos[4], res = 1, temp = num[x][y];
//化为二进制
for(int k = 0; k < 4; k++) {
pos[k] = temp % 2;
temp = (temp - pos[k]) / 2;
}
//标记已搜索过
num[x][y] = -1;
//判断四个方向是否可通
for(int k = 0; k < 4; k++) {
if(!pos[k]) {
if (!k) res += judge(x, y - 1);
else if (k == 1) res += judge(x - 1, y);
else if (k == 2) res += judge(x, y + 1);
else res += judge(x + 1, y);
}
}
return res;
}
int main()
{
cin >> m >> n;
int max = 0, number = 0;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++) scanf("%d", &num[i][j]);
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++) if(num[i][j] != -1) {
int temp = judge(i, j);
if(temp != 0) {
number++;
if(temp > max) max = temp;
}
}
cout << number << endl << max;
return 0;
}