/*
水题 体现出题目看不懂 额
*/
#include <iostream>
#include <string.h>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=55;
struct card{
char A,B;
card(char a=0,char b=0){ A=a;B=b; }
bool operator == (const card F){
if(A==F.A||B==F.B) return true;
else return false;
}
};
struct stac{
card T[maxn];
int t;
void sclear(){ t=0;}
bool sempty(){ return t==0;}
card top(){ return T[t]; }
void push(card R){ T[++t]=R;}
void pop(){t--;}
int ssize(){ return t;}
};
int main()
{
card temp,t1,tt,t3;
stac T,TT,T1,T3;
while(1){
bool flag=0;
vector<stac>Q;
char str[5];
for(int i=0;i<52;i++){
scanf("%s",str);
if(str[0]=='#') { flag=1;break; }
temp=card(str[0],str[1]);
T.sclear();
T.push(temp);
Q.push_back(T);
}
if(flag) break;
while(1){
flag=1; int a,b;
for(int i=1;i<Q.size();i++){
tt=Q[i].top();
if(i-3>=0) { t3=Q[i-3].top(); if(tt==t3) { flag=0; a=i;b=i-3; break; } }
if(i-1>=0) { t1=Q[i-1].top(); if(tt==t1) { flag=0;a=i;b=i-1; break; } }
}
if(flag) break;
Q[b].push(tt); Q[a].pop(); if(Q[a].sempty()){ Q.erase(Q.begin()+a);}
}
int a=Q.size();
if(a==1){ printf("1 pile remaining: %d",Q[0].ssize());}
else {
printf("%d piles remaining:",a);
for(int i=0;i<Q.size();i++)
printf(" %d",Q[i].ssize());
}
printf("
");
}
return 0;
}