#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define LOG(FMT...) fprintf(stderr, FMT) using namespace std; typedef long long ll; typedef unsigned long long ull; // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N = 52; int n; bool vis[N]; bool f[N][N]; char s[N], t[N]; int match[N], rp[N]; bool dfs(int u) { vis[u] = true; for (int i = 1; i <= n; ++i) { if (f[u][i]) { if (!match[i] || (!vis[match[i]] && dfs(match[i]))) { match[i] = u; return true; } } } return false; } void solve() { int m; scanf("%d%d", &m, &n); for (int i = 1; i <= n; ++i) fill(f[i] + 1, f[i] + n + 1, true); memset(match, 0, sizeof(match)); bool flag = true; while (m--) { scanf("%s%s", s + 1, t + 1); for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (s[i] != t[j]) f[i][j] = false; sort(s + 1, s + n + 1); sort(t + 1, t + n + 1); if (!equal(s + 1, s + n + 1, t + 1)) flag = false; } if (!flag) { puts("-1"); return; } for (int i = n; i; --i) { memset(vis, 0, sizeof(vis)); if (!dfs(i)) { puts("-1"); return; } } for (int i = 1; i <= n; ++i) rp[match[i]] = i; for (int i = 1; i < n; ++i) printf("%d ", rp[i]); printf("%d\n", rp[n]); } int main() { int t; scanf("%d", &t); while (t--) solve(); return 0; }