#include #include #include #include #include using namespace std; const int MAXN = 50 + 10; int n, m; int edg[MAXN][MAXN], pa[MAXN][MAXN]; char s1[MAXN], s2[MAXN]; int vis[MAXN], match[MAXN], ans[MAXN], ansvis[MAXN]; bool dfs(int x) { for(int i = 1; i <= m; i++) if(edg[x][i] && !vis[i]) { vis[i] = true; if(!match[i] || dfs(match[i])) { match[i] = x; return true; } } return false; } bool check(int st) { // cerr << "c" << st << endl; for(int i = 1; i <= m; i++) match[i] = 0; for(int i = 1; i <= st - 1; i++) match[ans[i]] = i; for(int i = st; i <= m; i++) { // cerr << i << endl; for(int j = 1; j <= m; j++) vis[j] = ansvis[j]; if(!dfs(i)) return false; } return true; } void work() { memset(edg, 0, sizeof(edg)); memset(pa, 0, sizeof(pa)); memset(vis, 0, sizeof(vis)); memset(match, 0, sizeof(match)); memset(ans, 0, sizeof(ans)); memset(ansvis, 0, sizeof(ansvis)); cin >> n >> m; for(int j = 1; j <= m; j++) for(int k = 1; k <= m; k++) edg[j][k] = 1; for(int i = 1; i <= n; i++) { cin >> (s1 + 1) >> (s2 + 1); for(int j = 1; j <= m; j++) for(int k = 1; k <= m; k++) pa[j][k] = 0; for(int j = 1; j <= m; j++) for(int k = 1; k <= m; k++) if(s1[j] == s2[k]) pa[j][k] = 1; for(int j = 1; j <= m; j++) for(int k = 1; k <= m; k++) edg[j][k] &= pa[j][k]; } // for(int i = 1; i <= m; i++) // { // for(int j = 1; j <= m; j++) // cerr << edg[i][j] << ' '; // cerr << endl; // } bool flag = check(1); // cerr << flag << endl; for(int i = 1; i <= m && flag; i++) { for(int j = 1; j <= m; j++) if(edg[i][j] && !ansvis[j]) { ans[i] = j, ansvis[j] = true; if(check(i + 1)) break; cerr << i << ' ' << j << endl; ans[i] = 0, ansvis[j] = false; } if(!ans[i]) flag = false; } if(!flag) cout << -1 << endl; else for(int i = 1; i <= m; i++) cout << ans[i] << (i == m ? '\n' : ' '); } int main() { ios::sync_with_stdio(false); int T; cin >> T; while(T--) work(); return 0; }