#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
vector<pii> mo;
vector<vector<int>> oszlop;
int harmadik(int egyik, int masik){
return 3-egyik-masik;
}
void atrak(int honnan, int mennyit, int hova){
if(mennyit == 0){
return;
}
atrak(honnan, mennyit-1, harmadik(honnan, hova));
mo.push_back({honnan, hova});
int ideigl = oszlop[honnan].back();
oszlop[honnan].pop_back();
oszlop[hova].push_back(ideigl);
atrak(harmadik(honnan, hova), mennyit-1, hova);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
oszlop.assign(3, vector<int>());
int legn = 0;
int x;
for(int i = 0; i < 3; i++){
while(true){
cin >> x;
if(!x)break;
oszlop[i].push_back(x);
legn = max(legn, x);
}
}
vector<vector<int>> cel(3, vector<int>());
for(int i = 0; i < 3; i++){
while(true){
cin >> x;
if(!x)break;
cel[i].push_back(x);
}
}
for(int i = 2; i <= legn; i++){
// oszlop, magassag
pii hely1, hely2;
for(int j = 0; j < 3; j++){
for(int k = 0; k < oszlop[j].size(); k++){
if(oszlop[j][k] == i){
hely1 = {j, k};
}
if(oszlop[j][k] == i-1){
hely2 = {j, k};
}
}
}
if(hely1.first == hely2.first) continue;
if(hely1.second != oszlop[hely1.first].size()-1){
cout << "ERROR\n";
}
atrak(hely2.first, oszlop[hely2.first].size()-hely2.second, hely1.first);
}
for(int i = legn; i >= 1; i--){
pii hely1, hely2;
for(int j = 0; j < 3; j++){
for(int k = 0; k < oszlop[j].size(); k++){
if(oszlop[j][k] == i){
hely1 = {j, k};
}
}
}
for(int j = 0; j < 3; j++){
for(int k = 0; k < cel[j].size(); k++){
if(cel[j][k] == i){
hely2 = {j, k};
}
}
}
// felette levoket at kell rakni nem abba az oszlop amire rakni kell
int felette = oszlop[hely1.first].size()-1 - hely1.second;
atrak(hely1.first, felette, harmadik(hely1.first, hely2.first));
// ot is atrakjuk a helyere
atrak(hely1.first, 1, hely2.first);
}
cout << mo.size() << "\n";
for(auto x : mo){
cout << x.first+1 << " " << x.second+1 << "\n";
}
}