#include using namespace std; typedef long long ll; #define mem(x,v) memset(x,v,sizeof(x)) #define Rep(i,a,b) for(register int i=(a);i<=int(b);++i) #define rep(i,a,b) for(register int i=(a);i=int(b);--i) #define gc getchar #define pc putchar #define fi first #define se second inline ll read(){ ll x=0,f=1;char c=gc(); for(;!isdigit(c);c=gc())if(c=='-')f=-1; for(;isdigit(c);c=gc())x=(x<<1)+(x<<3)+(c^48); return x*f; } inline void write(ll x){if(x<0)x=-x,pc('-');if(x>=10)write(x/10);putchar(x%10+'0');} inline void writeln(ll x){write(x);pc('\n');} inline void wri(ll x){write(x);pc(' ');} #define link LINK const int maxv = 505; int n,m; int mark[maxv][maxv],link[maxv],ans[maxv]; bool vis[maxv]; bool Hungary(int u){ for (int v=1;v<=m;v++){ if (!vis[v] && mark[u][v]){ vis[v] = true; if (link[v] == -1 || Hungary(link[v])){ link[v] = u; return true; } } } return false; } int get(int st){ int ans = 0; Rep(k,st,m){ memset(vis,false,sizeof(vis)); if(Hungary(k))ans++; } return ans; } void calc(){ memset(ans,-1,sizeof(ans)); memset(link,-1,sizeof(link)); if(get(1) != m){ puts("-1"); return ; } Rep(i,1,m){ Rep(j,1,m){ if(ans[j]==-1 && mark[i][j]){ ans[j] = i; // printf("{%d %d}\n",i,j); Rep(k,1,m) link[k] = ans[k]; if(i + get(i) == m) break; // puts("not break"); ans[j] = -1; } } } Rep(i,1,m) link[ans[i]] = i; Rep(i,1,m-1) wri(link[i]); writeln(link[m]); return ; } void solve(){ n = read(),m = read(); Rep(i,1,m)Rep(j,1,m)mark[i][j]=true; char a[55],b[55]; Rep(i,1,n){ scanf("%s",a+1); scanf("%s",b+1); Rep(i,1,m) Rep(j,1,m) if(a[i]!=b[j]) mark[i][j]=false; } calc(); } int main(){ int T = read(); while(T--){ solve(); } return 0; }