#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, K; cin >> N >> K; vector d(N); for (int i = 0; i < N; ++i) cin >> d[i]; vector> cut(N, vector(N, false)); vector> ans; mt19937 rng(123456789); while ((int)ans.size() < K) { int bestD = -1; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (cut[i][j]) continue; int v = d[i][j] - '0'; if (v >= 7) bestD = max(bestD, v); } } if (bestD < 7) break; vector> candidates; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { if (!cut[i][j] && d[i][j] - '0' == bestD) { candidates.emplace_back(i, j); } } } auto [r, c] = candidates[rng() % candidates.size()]; cut[r][c] = true; ans.emplace_back(r, c); int dist = 1; bool leftAlive = true; bool rightAlive = true; while ((leftAlive || rightAlive) && (int)ans.size() < K) { if (leftAlive) { int nc = c - dist; if (nc < 0 || d[r][nc] - '0' < 7) { leftAlive = false; } else { if (!cut[r][nc]) { cut[r][nc] = true; ans.emplace_back(r, nc); if ((int)ans.size() == K) break; } } } if (rightAlive) { int nc = c + dist; if (nc >= N || d[r][nc] - '0' < 7) { rightAlive = false; } else { if (!cut[r][nc]) { cut[r][nc] = true; ans.emplace_back(r, nc); if ((int)ans.size() == K) break; } } } ++dist; } } cout << ans.size() << '\n'; for (auto [i, j] : ans) { cout << i << ' ' << j << '\n'; } return 0; }