#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll x[4]={1,0,-1,0};
ll y[4]={0,1,0,-1};
ll g[60][60];
bool visited[60][60];
ll w,h;
ll ct,id;
struct s
{
ll px,py;
}tmp[1000];
void dfs(ll,ll);
void dfs1(ll,ll);
void dfs1(ll p,ll q)
{
//cout<<p<<" "<<q<<" \n";
visited[p][q]=1;
for(ll i=0;i<4;i++)
{
ll u,v;
u=p+x[i];
v=q+y[i];
if(g[u][v]==1&&visited[u][v]==0&&u>=0&&v>=0&&u<h&&v<w)
{
//cout<<p<<" "<<q<<" "<<u<<" "<<v<<endl;
dfs1(u,v);
}
if(g[u][v]==0&&visited[u][v]==0&&u>=0&&v>=0&&u<h&&v<w)
{
//cout<<u<<" "<<v<<endl;
//dfs(u,v);
tmp[id].px=u;
tmp[id].py=v;
id++;
}
}
return;
}
void dfs(ll xx,ll yy)
{
//cout<<xx<<" "<<yy<<endl;
ll u,v,i;
if(!visited[xx][yy]&&g[xx][yy]==1)
{
visited[xx][yy]=1;
//cout<<xx<<"="<<yy<<endl;
ct++;
for(i=0;i<4;i++)
{
u=xx+x[i];
v=yy+y[i];
if(u>=0&&v>=0&&u<h&&v<w&&!visited[u][v]&&g[u][v]!=-1)
{
if(g[u][v]==1)
{
dfs1(u,v);
}
if(g[u][v]==0)
{
dfs(u,v);
}
}
}
}
if(!visited[xx][yy]&&g[xx][yy]==0)
{
//cout<<xx<<"----"<<yy<<endl;
visited[xx][yy]=1;
for(i=0;i<4;i++)
{
u=xx+x[i];
v=yy+y[i];
if(u>=0&&v>=0&&u<h&&v<w&&!visited[u][v]&&g[u][v]!=-1)
{
if(g[u][v]==1)
{
//cout<<u<<"-"<<v<<endl;
ct++;
dfs1(u,v);
}
if(g[u][v]==0)
{
dfs(u,v);
}
}
}
}
//cout<<"ct::"<<ct<<endl;
return;
}
int main()
{
//ofstream o("op.txt");
ll i,j,k,l,m,n,cnt=1;
while(cin>>w>>h)
{
ll res;
if(w==0&&h==0)
break;
memset(g,0,sizeof(g));
memset(visited,0,sizeof(visited));
vector<ll>v;
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
char c;
cin>>c;
if(c=='.')
{
g[i][j]=-1;
}
if(c=='X')
{
g[i][j]=1;
}
}
}
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
if(visited[i][j]==0&&g[i][j]!=-1)
{
//cout<<i<<"==="<<j<<endl;
ct=0;
id=0;
dfs(i,j);
for(k=0;k<id;k++)
{
dfs(tmp[k].px,tmp[k].py);
}
//cout<<"CT:"<<ct<<endl;
v.push_back(ct);
}
}
}
printf("Throw %lld\n",cnt);
//o<<"Throw "<<cnt<<endl;
sort(v.begin(),v.end());
for(i=0;i<v.size();i++)
{
printf("%lld",v[i]);
//o<<v[i];
if(i!=v.size()-1)
{
//o<<" ";
printf(" ");
}
}
//o<<endl<<endl;
cnt++;
printf("\n\n");
}
return 0;
}
using namespace std;
typedef long long ll;
ll x[4]={1,0,-1,0};
ll y[4]={0,1,0,-1};
ll g[60][60];
bool visited[60][60];
ll w,h;
ll ct,id;
struct s
{
ll px,py;
}tmp[1000];
void dfs(ll,ll);
void dfs1(ll,ll);
void dfs1(ll p,ll q)
{
//cout<<p<<" "<<q<<" \n";
visited[p][q]=1;
for(ll i=0;i<4;i++)
{
ll u,v;
u=p+x[i];
v=q+y[i];
if(g[u][v]==1&&visited[u][v]==0&&u>=0&&v>=0&&u<h&&v<w)
{
//cout<<p<<" "<<q<<" "<<u<<" "<<v<<endl;
dfs1(u,v);
}
if(g[u][v]==0&&visited[u][v]==0&&u>=0&&v>=0&&u<h&&v<w)
{
//cout<<u<<" "<<v<<endl;
//dfs(u,v);
tmp[id].px=u;
tmp[id].py=v;
id++;
}
}
return;
}
void dfs(ll xx,ll yy)
{
//cout<<xx<<" "<<yy<<endl;
ll u,v,i;
if(!visited[xx][yy]&&g[xx][yy]==1)
{
visited[xx][yy]=1;
//cout<<xx<<"="<<yy<<endl;
ct++;
for(i=0;i<4;i++)
{
u=xx+x[i];
v=yy+y[i];
if(u>=0&&v>=0&&u<h&&v<w&&!visited[u][v]&&g[u][v]!=-1)
{
if(g[u][v]==1)
{
dfs1(u,v);
}
if(g[u][v]==0)
{
dfs(u,v);
}
}
}
}
if(!visited[xx][yy]&&g[xx][yy]==0)
{
//cout<<xx<<"----"<<yy<<endl;
visited[xx][yy]=1;
for(i=0;i<4;i++)
{
u=xx+x[i];
v=yy+y[i];
if(u>=0&&v>=0&&u<h&&v<w&&!visited[u][v]&&g[u][v]!=-1)
{
if(g[u][v]==1)
{
//cout<<u<<"-"<<v<<endl;
ct++;
dfs1(u,v);
}
if(g[u][v]==0)
{
dfs(u,v);
}
}
}
}
//cout<<"ct::"<<ct<<endl;
return;
}
int main()
{
//ofstream o("op.txt");
ll i,j,k,l,m,n,cnt=1;
while(cin>>w>>h)
{
ll res;
if(w==0&&h==0)
break;
memset(g,0,sizeof(g));
memset(visited,0,sizeof(visited));
vector<ll>v;
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
char c;
cin>>c;
if(c=='.')
{
g[i][j]=-1;
}
if(c=='X')
{
g[i][j]=1;
}
}
}
for(i=0;i<h;i++)
{
for(j=0;j<w;j++)
{
if(visited[i][j]==0&&g[i][j]!=-1)
{
//cout<<i<<"==="<<j<<endl;
ct=0;
id=0;
dfs(i,j);
for(k=0;k<id;k++)
{
dfs(tmp[k].px,tmp[k].py);
}
//cout<<"CT:"<<ct<<endl;
v.push_back(ct);
}
}
}
printf("Throw %lld\n",cnt);
//o<<"Throw "<<cnt<<endl;
sort(v.begin(),v.end());
for(i=0;i<v.size();i++)
{
printf("%lld",v[i]);
//o<<v[i];
if(i!=v.size()-1)
{
//o<<" ";
printf(" ");
}
}
//o<<endl<<endl;
cnt++;
printf("\n\n");
}
return 0;
}