#include<bits/stdc++.h>
using namespace std;
int n,m,num,d=0;
int a[300][300];
int c[100000];
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
#define check(x,y)(x<n&&x>=0&&y<m&&y>=0)
struct node {int x,y;};
void bfs(int dx,int dy){
++d;
a[dx][dy]=0;
num=1;
queue<node>q;
node start,next;
start.x=dx;
start.y=dy;
q.push(start);
while(!q.empty()){
start=q.front();
q.pop();
for(int i=0;i<4;i++){
next.x=start.x+dir[i][0];
next.y=start.y+dir[i][1];
if(check(next.x,next.y)&&a[next.x][next.y]==1){
q.push(next);
num++;
a[next.x][next.y]=0;
}
}
}c[d]=num;
}
int main(){
scanf("%d%d",&n,&m);
while(n!=0&&m!=0){
memset(c,0,sizeof(a));
d=0;
for (int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if (a[i][j]==1)bfs(i,j);
}
}
sort(c+1,c+d+1);
for(int i=1;i<=d;i++){
int r=c[i];
int k=1;
while(c[i]==c[i+1]){
i++;
k++;
}
printf("%d %d\n",r,k);
}
scanf("%d%d",&n,&m);}
return 0;
}