#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <unordered_map>
#include <queue>
using namespace std;
unordered_map<string, int> dist; // 状态对应的步数
unordered_map<string, pair<char, string>> path; //记录路径
char g[2][4];
queue<string> q;
// 交换行
string moveA(string state){
string a ="";
for(int i = 0; i < 4; i ++)
a += state[i + 4];
for(int i = 0; i < 4; i ++)
a += state[i];
return a;
}
// B操作
string moveB(string state){
string res = "";
res += state[3];
for(int i = 0; i < 3; i ++)
res += state[i];
res += state[7];
for(int i = 4; i < 7; i ++)
res += state[i];
return res;
}
// C操作
string moveC(string state){
string res = "";
res += state[0];
res += state[5];
res += state[1];
res += state[3];
res += state[4];
res += state[6];
res += state[2];
res += state[7];
return res;
}
void bfs(string start, string end){
if(start == end) return;
q.push(start);
dist[start] = 0;
while(q.size()){
auto t = q.front();
q.pop();
string m[3];
m[0] = moveA(t);
m[1] = moveB(t);
m[2] = moveC(t);
for(int i = 0; i < 3; i ++){
string a = m[i];
if(dist.count(a) == 0){ // 一定要看一下a有没有走过,没有走过才入队
dist[a] = dist[t] + 1;
path[a] = {char(i + 'A'), t}; // 妙啊!!! 0 + A = 0, 1 + A = B
if(a == end) break;
q.push(a);
}
}
}
}
int main(){
int x;
string start, tmp, end;
for(int i = 0; i < 8; i ++){
cin >> x;
tmp += char(x + '0'); // 数字i变字符i
}
// 这里有个坑!!!!!!!!
// 【题目】: 对于上图的魔板状态{1,2,3,4,8,7,6,5}
// 我们用序列 (1,2,3,4,5,6,7,8) 来表示,这是基本状态
// 所以样例所求的答案{2 6 8 4 5 7 3 1},其实是{2 6 8 4 1 3 5 7}
for(int i = 0; i < 4; i ++) end += tmp[i];
for(int i = 7; i > 3; i --) end += tmp[i];
for(int i = 0; i < 4; i ++) start += char(i + '1');
for(int i = 7; i > 3; i --) start += char(i + '1');
bfs(start, end);
cout << dist[end] << endl;
string b = end;
string res = "";
while(b != start){
res += path[b].first;
b = path[b].second;
}
reverse(res.begin(), res.end());
cout << res;
return 0;
}