#include<bits/stdc++.h>
using namespace std;
const int N = (1 << 24) + 5;
int s[20], t[20][5], dep, turn[5] = {0, 2, 3, 4, 1}, back[5] = {0, 4, 1, 2, 3}, pre[N], b[N];
int pts[5]={0,0,3,2,1};
bool vis[N];
struct node{
int stat, st, ev;
bool operator <(const node &b) const{return st + ev > b.st + b.ev;}
};
int getstatus(){
int sum = 0;
for(int i = 1; i <= 12; i++) sum = sum * 4 + s[i] - 1;
return sum;
}
int evaluate(){
int cnt = 0;
for(int i = 1; i <= 12; i++) cnt += pts[s[i]];
return (cnt + 1) / 2;
}
int cal(int num, int id){
return (num - back[num]) << ((12-id) * 2);
}
void outp(int status, int step){
if(step == 0) return;
outp(pre[status], step-1);
cout<<b[status]<<" ";
}
void bfs(){
priority_queue<node> q;
q.push({getstatus(), 0, evaluate()});
while(!q.empty()){
node d = q.top();
if(d.stat == 0){
cout<<d.st<<"\n";
outp(d.stat, d.st);
exit(0);
}
q.pop();
int eval = d.ev;
for(int i = 1; i <= 12; i++){
int si = ((d.stat >> ((12-i) * 2)) & 3) + 1;
int x = t[i][si];
int sx = ((d.stat >> ((12-x) * 2)) & 3) + 1;
si = turn[si], sx = turn[sx];
int nev = eval+pts[si]+pts[sx]-pts[back[si]]-pts[back[sx]], nst = d.stat + cal(sx, x) + cal(si, i);
if(!vis[nst]) vis[nst] = 1, pre[nst] = d.stat, b[nst] = i, q.push({nst, d.st + 1, nev});
}
}
}
int main(){
for(int i = 1; i <= 12; i++){
cin>>s[i];
for(int j = 1; j <= 4; j++) cin>>t[i][j];
}
bfs();
return 0;
}