#include <stdio.h>
#include <string.h>
int arr[101][101]={},asd,zxc,a,s;
int qwe[626]={};
void dfs(int i,int j)
{
if(i<1 || i>a || j<1 || j>s || arr[i][j]==0) return;
arr[i][j]=0;
asd++;
dfs(i-1,j);
dfs(i+1,j);
dfs(i,j-1);
dfs(i,j+1);
}
void dfs2(int i,int j)
{
if(i<1 || i>a || j<1 || j>s || arr[i][j]==1) return;
arr[i][j]=1;
zxc++;
dfs2(i-1,j);
dfs2(i+1,j);
dfs2(i,j-1);
dfs2(i,j+1);
}
int main()
{
int i,j,cnt=0,cut=0;
scanf("%d %d",&a,&s);
int tmp[101][101]={};
for(i=1;i<=a;i++)
{
for(j=1;j<=s;j++)
{
scanf("%d",&arr[i][j]);
tmp[i][j]=arr[i][j];
// 그리고 입력받을때 띄어쓰기 들어오니까 %1d 안해도대 !
}
}
// 그니까 지금 1에대해서 dfs 쭉 하고 -> 이거 하고나면 맵이 다 0이 되것지??
//
// 구러면 밑에 0에 대해서 할수가없자나 ??
// 그니까 새로운 이차원 배열 (임시배열)을 만들어 놓고 1에 대해서 dfs 하고
// 그담에 임시배열에있더거 다시 복사해와서 그걸로 0에 대대한 dfs를 해야댐 !! ok??
//
// 0에 대해서 dfs 쭉 해야하자나?? 근데
for(i=1;i<=a;i++)
{
for(j=1;j<=s;j++)
{
if(arr[i][j]!=0)
{
asd=0;
cnt++;
dfs(i,j);
qwe[cnt]=asd;
}
}
}
// 여기서 맵 다시 복원해놓고
//새로운거 시작
for(i=1;i<=a;i++)
{
for(j=1;j<=s;j++)
{
if(arr[i][j]!=0)
{
asd=0;
cut++;
dfs(i,j);
qwe[cut]=zxc;
}
}
}
printf("%d %d",cut,cnt);
return 0;
}