#include #include namespace Dinic { typedef long long LL; const LL Inf = 0x7fffffffffffffff; const int MN = 105, MM = 2605; int N, S, T; int h[MN], iter[MN], nxt[MM * 2], to[MM * 2], tot; LL w[MM * 2]; inline void Init(int _N) { N = _N, tot = 1; for (int i = 1; i <= N; ++i) h[i] = 0; } inline void SetST(int _S, int _T) { S = _S, T = _T; } inline void ins(int u, int v, LL x) { nxt[++tot] = h[u], to[tot] = v, w[tot] = x, h[u] = tot; } inline void insw(int u, int v, LL w1 = Inf, LL w2 = 0) { if (!u) u = S; if (!v) v = T; ins(u, v, w1), ins(v, u, w2); } int lv[MN], que[MN], l, r; inline bool Lvl() { for (int i = 1; i <= N; ++i) lv[i] = 0; lv[S] = 1; que[l = r = 1] = S; while (l <= r) { int u = que[l++]; for (int i = h[u]; i; i = nxt[i]) if (w[i] && !lv[to[i]]) { lv[to[i]] = lv[u] + 1; que[++r] = to[i]; } } return lv[T] != 0; } LL Flow(int u, LL f) { if (u == T) return f; LL d = 0, s = 0; for (int &i = iter[u]; i; i = nxt[i]) if (w[i] && lv[to[i]] == lv[u] + 1) { d = Flow(to[i], std::min(f, w[i])); f -= d, s += d; w[i] -= d, w[i ^ 1] += d; if (!f) break; } return s; } inline LL Dinic() { LL Ans = 0; while (Lvl()) { for (int i = 1; i <= N; ++i) iter[i] = h[i]; Ans += Flow(S, Inf); } return Ans; } } typedef long long LL; int main() { int T; scanf("%d", &T); while (T--) { int N, M; static char S1[55], S2[55]; static int C[55][55], P[55], V[55]; scanf("%d%d", &N, &M); for (int i = 1; i <= M; ++i) P[i] = V[i] = 0; for (int i = 1; i <= M; ++i) for (int j = 1; j <= M; ++j) C[i][j] = 1; for (int k = 1; k <= N; ++k) { scanf("%s%s", S1 + 1, S2 + 1); for (int i = 1; i <= M; ++i) for (int j = 1; j <= M; ++j) if (S1[i] != S2[j]) C[i][j] = 0; } Dinic::Init(2 * M + 2), Dinic::SetST(2 * M + 1, 2 * M + 2); for (int i = 1; i <= M; ++i) Dinic::insw(0, i, 1), Dinic::insw(M + i, 0, 1); for (int i = 1; i <= M; ++i) for (int j = 1; j <= M; ++j) if (C[i][j]) Dinic::insw(i, M + j); if (Dinic::Dinic() != M) { puts("-1"); continue; } for (int k = 1; k <= M; ++k) { int ch = 0; for (int c = 1; c <= M; ++c) { if (V[c]) continue; Dinic::Init(2 * M + 2), Dinic::SetST(2 * M + 1, 2 * M + 2); for (int i = 1; i <= M; ++i) Dinic::insw(0, i, 1), Dinic::insw(M + i, 0, 1); for (int i = k + 1; i <= M; ++i) for (int j = 1; j <= M; ++j) if (!V[j] && j != c && C[i][j]) Dinic::insw(i, M + j); if (Dinic::Dinic() == M - k) { ch = c; break; } } if (!ch) { puts("??"); return 0x55; } P[k] = ch, V[ch] = 1; } for (int i = 1; i <= M; ++i) printf("%d%c", P[i], " \n"[i == M]); } return 0; }