#include <bits/stdc++.h>
using namespace std;
char a[50010];
int g, prt[50010], step[50010], s, l;
bool vis[1000010];
struct node {
int a[2][4];
}st, lt, q[10010];
int fac(int n) {
if (n == 1 || n == 0) return 1;
return n * fac(n - 1);
}
int cantor(node x) {
int t[8], res = 0;
for (int i = 0; i <= 3; i ++) t[i] = x.a[0][i], t[7 - i] = x.a[1][3 - i];
for (int i = 0; i <= 7; i ++) {
int dayu = 0;
for (int j = i + 1; j <= 7; j ++) {
if (t[j] < t[i]) dayu++;
}
res += dayu * fac(7 - i);
}
return res;
}
node zhuan(char op, int nm) {
node w;
if (op == 'A') {
for (int i = 0; i <= 3; i ++) {
w.a[0][i] = q[nm].a[1][i];
w.a[1][i] = q[nm].a[0][i];
}
}
if (op == 'B') {
w.a[0][0] = q[nm].a[0][3], w.a[1][0] = q[nm].a[1][3];
for (int i = 1; i <= 3; i ++) {
w.a[0][i] = q[nm].a[0][i - 1];
w.a[1][i] = q[nm].a[1][i - 1];
}
}
if (op == 'C') {
w.a[0][0] = q[nm].a[0][0];
w.a[0][1] = q[nm].a[1][1];
w.a[0][2] = q[nm].a[0][1];
w.a[0][3] = q[nm].a[0][3];
w.a[1][0] = q[nm].a[1][0];
w.a[1][1] = q[nm].a[1][2];
w.a[1][2] = q[nm].a[0][2];
w.a[1][3] = q[nm].a[1][3];
}
return w;
}
void print(int nm) {
if (nm == 1) return ;
print(prt[nm]);
cout << a[nm];
}
void bfs() {
int head = 1, tail = 1, w;
node wt;
q[1] = st;
step[1] = 0;
prt[1] = 1;
while (head <= tail) {
for (char i = 'A'; i <= 'C'; i ++) {
wt = zhuan(i, head);
w = cantor(wt);
if (!vis[w]) {
vis[w] = 1;
q[++tail] = wt;
step[tail] = step[head] + 1;
prt[tail] = head;
a[tail] = i;
if (w == l) {
cout << step[tail] << endl;
print(tail);
return ;
}
}
}
head ++;
}
}
int main() {
for (int i = 0; i <= 3; i ++) {
st.a[0][i] = i + 1;
st.a[1][i] = 8 - i;
}
cin >> lt.a[0][0] >> lt.a[0][1] >> lt.a[0][2] >> lt.a[0][3];
cin >> lt.a[1][0] >> lt.a[1][1] >> lt.a[1][2] >> lt.a[1][3];
s = cantor(st);
l = cantor(lt);
vis[s] = 1;
if (l == s) return cout << 0, 0;
bfs();
return 0;
}