#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 20;
int n, m;
LL s;
int a[N][N];
LL l[N];
unordered_map<LL, PII> Map;
int main() {
// freopen(".in", "r", stdin);
// freopen(".out", "w", stdout);
scanf("%d%d", &n, &m);
LL sum = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
sum += a[i][j];
}
}
scanf("%lld", &s);
if(sum == s) {
puts("YES");
printf("0");
return 0;
}
int res = 2e9;
int t1 = 0, t2 = 0, t3 = 0;
for(int i = 0; i < (1 << n); i++) {
int re = n;
for(int j = 1; j <= n; j++) {
if((i >> j - 1) & 1) {
re--;
}
}
for(int j = 1; j <= m; j++) {
l[j] = 0;
for(int k = 1; k <= n; k++) {
if((i >> k - 1) & 1) {
l[j] += a[k][j];
}
}
}
Map.clear();
for(int j = 0; j < (1 << m / 2); j++) {
LL t = 0;
int p = m / 2;
for(int k = 1; k <= m / 2; k++) {
if((j >> k - 1) & 1) {
t += l[k];
p--;
}
}
PII q = Map[t];
if(q.first == 0 && q.second == 0) Map[t] = {j, p};
else {
if(q.second > p) {
Map[t] = {j, p};
}
}
}
for(int j = 0; j < (1 << m - m / 2); j++) {
LL t = 0;
int p = m - m / 2;
for(int k = 1; k <= m - m / 2; k++) {
if((j >> k - 1) & 1) {
t += l[m / 2 + k];
p--;
}
}
PII q = Map[s - t];
if(q.second || q.first) {
if(p + q.second + re < res) {
res = p + q.second + re;
t1 = q.first;
t2 = j;
t3 = i;
}
}
}
}
if(res == 2e9) puts("NO");
else {
puts("YES");
printf("%d\n", res);
for(int i = 1; i <= n; i++) {
if(!((t3 >> i - 1) & 1)) {
printf("1 %d\n", i);
}
}
for(int i = 1; i <= m / 2; i++) {
if(!((t1 >> i - 1) & 1)) {
printf("2 %d\n", i);
}
}
for(int i = 1; i <= m - m / 2; i++) {
if(!((t2 >> i - 1) & 1)) {
printf("2 %d\n", m / 2 + i);
}
}
}
return 0;
}
觉得可能是 map 存了个 pair 的原因,但不知道怎么优化。