#include #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define per(i,a,b) for(int i=(a);i>=(b);i--) #define REP(i,n) for(int i=(0);i<(n);i++) #define fi first #define se second #define pb push_back #define mp make_pair using namespace std; typedef pair pii; typedef vector vi; typedef long long ll; template inline void read(T &x){ int f=0;x=0;char ch=getchar(); for(;!isdigit(ch);ch=getchar())f|=(ch=='-'); for(;isdigit(ch);ch=getchar())x=x*10+ch-'0'; if(f)x=-x; } const int N=55; namespace G{ int f[N][N],x[N],y[N],vis[N],n,tim; inline void init(int _n){ n=_n,tim=1; memset(f,0,sizeof f); memset(vis,0,sizeof vis); memset(x,0,sizeof x); memset(y,0,sizeof y); } int dfs(int u){ vis[u]=tim; rep(v,1,n) if(f[u][v]){ if(!y[v]||vis[y[v]]!=tim&&dfs(y[v])){ y[v]=u,x[u]=v; return 1; } } return 0; } inline int solve(){ int res=0; per(i,n,1) if(dfs(i)) tim++,res++; return res; } } char s[N],t[N]; int m,n; void MAIN(){ read(m),read(n); G::init(n); rep(i,1,n)rep(j,1,n) G::f[i][j]=1; rep(i,1,m){ scanf("%s%s",s+1,t+1); rep(a,1,n)rep(b,1,n) if(s[a]!=t[b]) G::f[a][b]=0; } if(G::solve()