#include <bits/stdc++.h>
using namespace std;
#define P pair<char, char>
#define mp(x, y) make_pair(x, y)vector< P > oper_list;
const int len = 4;
const int wide = 4;
const int _size = len * wide;
const int _num = _size + (_size&1);
const int half = (_num >> 1);
const int _dir = 4;
const int maxs = 43046721;
char f[maxs], g[maxs];
int rev[maxs];
char step_forward[_size][_dir];
char board[_size], sum_board = 0;
char belong[_size], sum_belong = 0;
bool used[_num];
char card[_num][_dir];
int next_k = -1, next_x = -1;
char input_size = 0;
char now_player = 0;inline void Extend(int s,char *_map) {for (int i=0; i<_size; i++) _map[i] = s%3-1, s/=3;
}inline int Mark(char *_map) {int s=0;for (char i=_size-1; i>=0; i--) s = (s<<1) + s + (_map[i]+1);return s;
}inline int Rev(char *_map) {for (int i=0; i<_size; i++) if (_map[i] != -1) _map[i] = 1 - _map[i];return Mark(_map);
}char Dp(char *p, int s) {if (p[s] != -1) return p[s];if (p == f) {f[s] = 0;char _map[_size], new_map[_size];Extend(s, _map);for (char x=0; x<_size; x++) if (_map[x] == -1) {for (int i=0; i<_size; i++) new_map[i] = _map[i];new_map[x] = 1;char score = 0;for (char u=0; u<_dir; u++) {char move_to = step_forward[x][u];if (move_to == -1 || new_map[move_to] != 0) continue;++score;new_map[move_to] = 1;}int t = Mark(new_map);f[s] = max(f[s], (char)(score + Dp(g, t)));}}else {g[s] = 100;char _map[_size], new_map[_size];Extend(s, _map);for (char x=0; x<_size; x++) if (_map[x] == -1) {for (int i=0; i<_size; i++) new_map[i] = _map[i];new_map[x] = 0;int t = Mark(new_map);g[s] = min(g[s], Dp(f, t));}if (g[s] == 100) g[s] = 0;}return p[s];
}inline void Preprocess() {for (int i=0; i<_size; i++){if (i < wide) step_forward[i][0] = -1;else step_forward[i][0] = i - wide;if (i % len == 0) step_forward[i][1] = -1;else step_forward[i][1] = i - 1;if (i + wide < _size) step_forward[i][2] = i + wide;else step_forward[i][2] = -1;if (i % len == len - 1) step_forward[i][3] = -1;else step_forward[i][3] = i + 1;}memset(f, -1, sizeof(f));memset(g, -1, sizeof(g));char tmp_map[_size];for (int s=0; s<maxs; s++) {Dp(f, s);Dp(g, s);Extend(s, tmp_map);rev[s] = Rev(tmp_map);}
}inline void Simulate(char k, char x) {oper_list.push_back( mp(k, x) );board[x] = k;bool cur = (k >= half? 1: 0);sum_board += cur;belong[x] = cur;sum_belong += cur;used[k] = true;for (int u=0; u<_dir; u++) if (step_forward[x][u] != -1) {char move_to = step_forward[x][u];if (board[move_to] != -1) {char p = board[move_to];char &val = belong[move_to];if (val != cur) {char v = (u >= 2? u-2: u+2);if (card[k][u] > card[p][v]) {sum_belong -= val;val = cur;sum_belong += cur;}}}}
}inline void Initialize() {freopen("chess.in", "r", stdin);for (int i=0; i<_num; i++)for (int j=0; j<_dir; j++) {int val = 0;cin >> val;card[i][j] = val;}memset(board, -1, sizeof(board));memset(belong, -1, sizeof(belong));memset(used, false, sizeof(used));int k = -1, x = -1;cin >> k >> x;while (k >= 0) {Simulate(k, x);k = -1, x = -1;cin >> k >> x;}fclose(stdin);input_size = oper_list.size();
}inline void Reverse(char k, char x, char *tmp_belong, char tmp_sum) {oper_list.pop_back();board[x] = -1;if (k >= half) --sum_board;for (int i=0; i<_size; i++) belong[i] = tmp_belong[i];sum_belong = tmp_sum;used[k] = false;
}char Dfs(char cur, char min_limit, char max_limit) {char now_score = sum_belong - sum_board;if (oper_list.size() == _size) return now_score;char invalid = (cur? 100: -100);int s = Mark(belong);int t = rev[s];if (cur) {if (now_score - g[t] >= max_limit) return invalid;if (now_score + f[s] <= min_limit) return min_limit;}else {if (now_score + g[s] <= min_limit) return invalid;if (now_score - f[t] >= max_limit) return max_limit;}char top_score = -invalid;char enemy = (cur == 0? half: 0);char tmp_sum = sum_belong;char tmp_belong[_size];for (int i=0; i<_size; i++) tmp_belong[i] = belong[i];for (char k=cur; k< cur + half; k++) if (!used[k])for (char x=0; x<_size; x++) if (board[x] == -1) {Simulate(k, x);char score = Dfs(enemy, min_limit, max_limit);Reverse(k, x, tmp_belong, tmp_sum);if (cur) {if (score >= max_limit) return invalid;if (score <= min_limit) continue;min_limit = score;if (score > top_score) {top_score = score;if (oper_list.size() == input_size) next_k = k, next_x = x;}}else {if (score <= min_limit) return invalid;if (score >= max_limit) continue;max_limit = score;if (score < top_score) {top_score = score;if (oper_list.size() == input_size) next_k = k, next_x = x;}}}if (top_score == -invalid) {if (cur) return min_limit;else return max_limit;}return top_score;
}int main(void) {Preprocess();Initialize();now_player = ((oper_list.size() > 0) && (oper_list.rbegin()->first >= half)? 0: half);clock_t start = clock();int ans = Dfs(now_player, -100, 100);clock_t end = clock();cout << (end - start) / 1000000.0 << endl;cout << ans << endl;cout << next_k << " " << next_x << endl;for (int i=0; i<_dir; i++) cout << (int)card[next_k][i] << " ";return 0;
}