#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef double db; #define _Zero(a) memset(a,0,sizeof(a)) #define _Neg1(a) memset(a,-1,sizeof(a)) #define _Inf(a) memset(a,0x3f,sizeof(a)) #define _NegInf(a) memset(a,0xcf,sizeof(a)) #define _Rep(i,a,b) for(int (i)=(a);(i)<=(b);i++) #define _Dep(i,a,b) for(int (i)=(a);(i)>=(b);i--) #define _Out(a) cerr<<(#a)<<" = "<<(a)<void test(T x,Args...args){cerr<>1)%MOD : qpow(a*a%MOD,b>>1))%MOD :1; } ll qpow(ll a, ll b, ll c) {return b?((b&1)?a*qpow(a*a%c,b>>1)%c : qpow(a*a%c,b>>1)) % c: 1; } ll gcd(ll a, ll b){return b?gcd(b,a% b): a; } int sign(db x) { return x<-EPS ? -1: x>EPS; } int dbcmp(db l, db r) { return sign(l - r); } const int maxn=10010; vector line[maxn]; int boy[maxn]; int girl[maxn]; int used[maxn]; int n,m; bool dfs(int x) { for(int i=1;i<=m;i++) { if(used[i]==0) { if(count(line[x].begin(),line[x].end(),i)!=0) { used[i]=1; if(boy[i]==0 || dfs(boy[i])==1) { boy[i]=x; girl[x]=i; return 1; } } } } return 0; } vector ans; int G[55][55]; int main() { int T; scanf("%d",&T); while(T--) { _Zero(boy);_Zero(girl);_Zero(used); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) G[i][j]=1; line[i].clear(); } for(int x=1;x<=n;x++) { char S[55],T[55]; scanf("%s%s",S+1,T+1); setst[33]; for(int i=1;T[i];i++) st[T[i]-'a'].insert(i); for(int i=1;S[i];i++) { for(int j=1;j<=m;j++) { if(!st[S[i]-'a'].count(j))G[i][j]=0; } } } for(int i=1;i<=m;i++) { for(int j=1;j<=m;j++) { if(G[i][j]) { line[i].push_back(j); //printf("(%d,%d)",i,j); } } } bool f=1; for(int i=m;i>=1;i--) { _Zero(used); // for(int j=0;j