#include <bits/stdc++.h>
using namespace std;
const int inf = 8;
int n, ans, num_node, sta[22];
int mat[16][8], pa[22][2], kind[22], to[4];
int a_pa[22][2], a_kind[22], ae[4], kd[5][3], a_st[22];
struct point {
int num, y[2][2];
};
point pt[10];
bool dp[22][22];
int ix[2], iy[2], gao;
bool vis[1 << 16];
int adj[1 << 16],one[1 << 16],times;//先把基础数据建立好
void dfs(int state, int le, int hi) {
int i, j, s, p, q, id, g = 0, lo;
if (state == 0) {
ans = min(ans, num_node - 8);
for (i = 0; i < num_node; i++)
a_st[i] = sta[i];
for (i = 8; i < num_node; i++) {
if (pa[i][0] >= 8) a_pa[i - 8][0] = pa[i][0] - 4;
else a_pa[i - 8][0] = pa[i][0];
if (pa[i][1] >= 8) a_pa[i - 8][1] = pa[i][1] - 4;
else a_pa[i - 8][1] = pa[i][1];
a_kind[i - 8] = kind[i];}
for (i = 4; i < 8; i++) {
if (pa[i][0] >= 8) ae[i - 4] = pa[i][0] - 4;
else ae[i - 4] = pa[i][0];}
return;}
times++;
if (times > 402000) return;
int a, b;
if (num_node > 8) lo = pa[num_node - 1][1];
else lo = 0;
int list[n], cnt_list = 0;
for (i = 0; i < n; i++) {
if (pt[i].num)
list[cnt_list++] = i;}
for (j = lo; j < num_node; j++){
if (j >= 4 && j < 8) j = 8;
for (s = le; s <= j; s++) {
if (s >= 4 && s < 8) s = 8;
if (s == j && s != 0) continue;
if (num_node > 8 && pa[num_node - 1][1] == j && pa[num_node - 1][0] == s) continue;
for (int ii = 0; ii < cnt_list; ii++) {
i = list[ii];
int aa = sta[s], bb = sta[j];
if (kd[i][0] == 1)
aa = 65535 ^ aa;
if (kd[i][1] == 1)
bb = 65535 ^ bb;
if (kd[i][2] == 0) sta[num_node] = aa & bb;
else if (kd[i][2] == 1) sta[num_node] = aa | bb;
else sta[num_node] = aa ^ bb;
if (!vis[sta[num_node]]) {
int ns = state ^ (state & adj[sta[num_node]]);
if (one[ns] + num_node + 1 - 8 < ans) {
kind[num_node] = i;
pa[num_node][1] = j;
pa[num_node][0] = s;
pt[i].num--;
vis[sta[num_node]] = true;
num_node++;
int nl = le, nh = hi;
if (s >= hi)
nh = s;
else
nl = s;
if (pa[nl][0] < 4)
dfs(ns, nl, nh);
num_node--;
vis[sta[num_node]] = false;
pt[i].num++;
}}
if (times > 402000) return;}}}}//函数
int main() {
int i, j, s, p, q, a, b, x, y;
scanf("%d", &n);
memset(kd, -1, sizeof(kd));
for (i = 0; i < n; i++) {
scanf("%d%d%d%d", &pt[i].num, &pt[i].y[0][0], &pt[i].y[0][1], &pt[i].y[1][1]);
pt[i].y[1][0] = pt[i].y[0][1];
for (j = 0; j < 2; j++) {
for (s = 0; s < 2; s++) {
for (p = 0; p < 3; p++) {
for (x = 0; x < 2; x++) {
for (y = 0; y < 2; y++) {
int nx = x, ny = y, z;
if (j == 1)
nx ^= 1;
if (s == 1)
ny ^= 1;
if (p == 0) z = nx & ny;
else if (p == 1) z = nx | ny;
else z = nx ^ ny;
if (z != pt[i].y[x][y]) break;
}
if (y < 2)
break;}
if (x >= 2) {
kd[i][0] = j;
kd[i][1] = s;
kd[i][2] = p;
break;}}
if (p < 3)
break;}
if (s < 2)
break;}}
for (i = 0; i < 16; i++) {
int a = 0, b = 0;
for (j = 0; j < 8; j++) {
scanf("%d", &mat[i][j]);
if (j < 4) a |= (mat[i][j] << j);}
for (j = 4; j < 8; j++)
to[j - 4] |= (mat[i][j] << a);
}
for (i = 0; i < 4; i++)
adj[to[i]] |= (1 << i);
for (i = 1; i < (1 << 16); i++)
one[i] = one[i - (i & (-i))] + 1;
ans = inf;
memset(sta, -1, sizeof(sta));
for (i = 0; i < 4; i++)
sta[i] = 0;
for (i = 0; i < 16; i++) {
for (j = 0; j < 4; j++) {
if (i & (1 << j))
sta[j] |= (1 << i);}}
num_node = 8;
ans = inf;
memset(vis, false, sizeof(vis));
memset(pa, -1, sizeof(pa));
memset(ix, 0, sizeof(ix));
iy[0] = iy[1] = 4;
int st = 15;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (to[i] == sta[j]) break;}
if (j < 4) st ^= (1 << i);}
dfs(st, 0, 0);
if (ans == inf)
puts("No");
else{
puts("Yes");
printf("%d\n", ans);
for (i = 0; i < ans; i++)
printf("%d %d %d %d\n", i + 5, a_kind[i] + 1, a_pa[i][1] + 1, a_pa[i][0] + 1);
for (i = 0; i < 4; i++) {
for (j = 0; j < ans + 8; j++) {
if (j >= 4 && j < 8)
continue;
if (to[i] == a_st[j]) {
ae[i] = j;
if (j >= 8)
ae[i] -= 4;
break;}}}
printf("%d %d %d %d\n", ae[0] + 1, ae[1] + 1, ae[2] + 1, ae[3] + 1);
}}