#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 24;
int op[8][7] = {
{0, 2, 6, 11, 15, 20, 22},
{1, 3, 8, 12, 17, 21, 23},
{10, 9, 8, 7, 6, 5, 4},
{19, 18, 17, 16, 15, 14, 13},
{23, 21, 17, 12, 8, 3, 1},
{22, 20, 15, 11, 6, 2, 0},
{13, 14, 15, 16, 17, 18, 19},
{4, 5, 6, 7, 8, 9, 10}
};
int opposit[8] = {5,4,7,6,1,0,3,2};
int center[8] = {6, 7, 8, 11, 12, 15, 16, 17};
int path[100];
int q[24];
int f(){
static int sum[4];
memset(sum,0,sizeof sum);
for (int i = 0; i < 8; i ++ ){
sum[q[center[i]]]++;
}
int mx=0;
for(int i=1;i<=3;i++){
mx=max(mx,sum[i]);
}
return 8-mx;
}
void operate(int x){
int t = q[op[x][0]];
for(int i=0;i<6;i++){
q[op[x][i]]=q[op[x][i+1]];
}
q[op[x][6]]=t;
}
bool dfs(int u,int depth,int last){
if(u+f()>depth){
return false;
}
if(f()==0){
return true;
}
for (int i = 0; i < 8; i ++ ){
if(opposit[i]!=last){
operate(i);
path[u]=i;
if(dfs(u+1,depth,i))return true;
operate(opposit[i]);
}
}
return false;
}
int main(){
while(cin>>q[0],q[0]){
for (int i = 1; i < N; i ++ ){
cin>>q[i];
}
int depth=0;
while(!dfs(0,depth,-1))depth++;
if(!depth)cout<<"No moves needed"<<endl;
else{
for (int i = 0; i < depth; i ++ ){
cout<<(char)(path[i]+'A');
}
cout<<endl;
}
cout<<q[6]<<endl;
}
return 0;
}