#include using namespace std; #define MAXN 105 #define MAXK 105 int N, K; int A[MAXN][MAXK]; string name[MAXN]; int ans[MAXN]; bool v[MAXN]; vector G[MAXN]; int st[MAXN], dr[MAXN]; bool pairup(int node) { if (v[node]) { return false; } v[node] = true; for (int x : G[node]) { if (st[x] == -1) { dr[node] = x; st[x] = node; return true; } } for (int x : G[node]) { if (st[x] != -1 && pairup(st[x])) { dr[node] = x; st[x] = node; return true; } } return false; } int main() { // assert(freopen("subreddits.in", "r", stdin)); // assert(freopen("subreddits.out", "w", stdout)); cin.sync_with_stdio(false); cin >> N >> K; for (int i = 0; i < N; i++) { cin >> name[i]; for (int j = 0; j < K; j++) { cin >> A[i][j]; } } for (int j = K - 1; j >= 0; j--) { for (int i = 0; i < N; i++) { if (j >= 2 && A[i][j] > A[i][j - 1] && A[i][j - 1] > A[i][j - 2]) { G[i].push_back(j); } } } for (int i = 0; i < max(N, K); i++) { st[i] = dr[i] = -1; } bool ok = true; while (ok) { ok = false; for (int i = 0; i < N; i++) { v[i] = false; } for (int i = 0; i < N; i++) { if (dr[i] == -1 && pairup(i)) { ok = true; } } } for (int j = 0; j < K; j++) { if (st[j] == -1) { cout << "none\n"; } else { cout << name[st[j]] << '\n'; } } return 0; }