#include <cstdio>
#include <cstdlib>
#include <cstring>
struct data{
int m;
int l;
};
int comp_data(const void *l,const void *r){
int lm = (*(data *)l).m;
int rm = (*(data *)r).m;
int ll = (*(data *)l).l;
int rl = (*(data *)r).l;
return ((rm - lm == 0)?rl - ll:rm - lm);
}
char map[100][101];
bool flg[100][100];
int H,W;
int search(data *,int,int);
int main(void){
scanf("%d %d\n",&H,&W);
int list_cnt = 0;
data *list = (data *)malloc(sizeof(data) * (int)(H * W / 2));
if(list == NULL) return -1;
memset(list,0,sizeof(data) * (int)(H * W / 2));
for(int i = 0;i < H;i++) scanf("%s\n",map[i]);
for(int i = 0;i < H;i++){
for(int j = 0;j < W;j++){
if(map[i][j] == '#' && !flg[i][j]){
search(&list[list_cnt++],j,i);
}
}
}
qsort(list,list_cnt,sizeof(data),comp_data);
for(int i = 0;i < list_cnt;i++){
printf("%d %d\n",list[i].m,list[i].l);
}
return 0;
}
int search(data *counter,int x,int y){
if(x < 0 || x >= W || y < 0 || y >= H){
(*counter).l++;
return 1;
}
if(map[y][x] == '.'){
(*counter).l++;
return 2;
}
if(flg[y][x]) return -1;
else{
flg[y][x] = true;
counter->m++;
search(counter,x + 1,y);
search(counter,x - 1,y);
search(counter,x,y + 1);
search(counter,x,y - 1);
}
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjc3RyaW5nPgoKc3RydWN0IGRhdGF7CiAgICBpbnQgbTsKICAgIGludCBsOwp9OwoKaW50IGNvbXBfZGF0YShjb25zdCB2b2lkICpsLGNvbnN0IHZvaWQgKnIpewogICAgaW50IGxtID0gKCooZGF0YSAqKWwpLm07CiAgICBpbnQgcm0gPSAoKihkYXRhICopcikubTsKICAgIGludCBsbCA9ICgqKGRhdGEgKilsKS5sOwogICAgaW50IHJsID0gKCooZGF0YSAqKXIpLmw7CiAgICAKICAgIHJldHVybiAoKHJtIC0gbG0gPT0gMCk/cmwgLSBsbDpybSAtIGxtKTsKfQoKY2hhciBtYXBbMTAwXVsxMDFdOwpib29sIGZsZ1sxMDBdWzEwMF07CmludCBILFc7CgppbnQgc2VhcmNoKGRhdGEgKixpbnQsaW50KTsKCmludCBtYWluKHZvaWQpewoKICAgIHNjYW5mKCIlZCAlZFxuIiwmSCwmVyk7CiAgICAKICAgIGludCBsaXN0X2NudCA9IDA7CiAgICBkYXRhICpsaXN0ID0gKGRhdGEgKiltYWxsb2Moc2l6ZW9mKGRhdGEpICogKGludCkoSCAqIFcgLyAyKSk7CiAgICBpZihsaXN0ID09IE5VTEwpIHJldHVybiAtMTsKICAgIG1lbXNldChsaXN0LDAsc2l6ZW9mKGRhdGEpICogKGludCkoSCAqIFcgLyAyKSk7CiAgICAKICAgIGZvcihpbnQgaSA9IDA7aSA8IEg7aSsrKSBzY2FuZigiJXNcbiIsbWFwW2ldKTsKICAgIAogICAgZm9yKGludCBpID0gMDtpIDwgSDtpKyspewogICAgICAgIGZvcihpbnQgaiA9IDA7aiA8IFc7aisrKXsKICAgICAgICAgICAgaWYobWFwW2ldW2pdID09ICcjJyAmJiAhZmxnW2ldW2pdKXsKICAgICAgICAgICAgICAgIHNlYXJjaCgmbGlzdFtsaXN0X2NudCsrXSxqLGkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcXNvcnQobGlzdCxsaXN0X2NudCxzaXplb2YoZGF0YSksY29tcF9kYXRhKTsKICAgIGZvcihpbnQgaSA9IDA7aSA8IGxpc3RfY250O2krKyl7CiAgICAgICAgcHJpbnRmKCIlZCAlZFxuIixsaXN0W2ldLm0sbGlzdFtpXS5sKTsKICAgIH0KICAgIHJldHVybiAwOwp9CgppbnQgc2VhcmNoKGRhdGEgKmNvdW50ZXIsaW50IHgsaW50IHkpewogICAgaWYoeCA8IDAgfHwgeCA+PSBXIHx8IHkgPCAwIHx8IHkgPj0gSCl7CiAgICAgICAgKCpjb3VudGVyKS5sKys7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBpZihtYXBbeV1beF0gPT0gJy4nKXsKICAgICAgICAoKmNvdW50ZXIpLmwrKzsKICAgICAgICByZXR1cm4gMjsKICAgIH0KICAgIAogICAgaWYoZmxnW3ldW3hdKSByZXR1cm4gLTE7CiAgICBlbHNlewogICAgICAgIGZsZ1t5XVt4XSA9IHRydWU7CiAgICAgICAgY291bnRlci0+bSsrOwogICAgICAgIAogICAgICAgIHNlYXJjaChjb3VudGVyLHggKyAxLHkpOwogICAgICAgIHNlYXJjaChjb3VudGVyLHggLSAxLHkpOwogICAgICAgIHNlYXJjaChjb3VudGVyLHgseSArIDEpOwogICAgICAgIHNlYXJjaChjb3VudGVyLHgseSAtIDEpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=