/*
    1y,有点意外
    对应匈牙利算法看,不同的是右边的点可匹配多个
*/
#include
< cstdio >
#include
< cstring >

const   int  MAXN = 1005 ;

struct  Node{
    
int  v,next;
}nodes[MAXN
* MAXN];

int  n,m;
int  G[MAXN];
int  alloc,N;
bool  vi[MAXN];
int  link[MAXN][MAXN];

void  add( int  a, int  b){
    alloc
++ ;
    nodes[alloc].v
= b,nodes[alloc].next = G[a];
    G[a]
= alloc;
}
bool  find( int  u){
    
for ( int  son = G[u];son !=- 1 ;son = nodes[son].next){
        
int  v = nodes[son].v;
        
// v对应多个匹配
         if (vi[v]) continue ;
        vi[v]
= 1 ;
        
if (link[v][ 0 ] < N){
            link[v][
++ link[v][ 0 ]] = u;
            
return   true ;
        }
        
for ( int  i = 1 ;i <= link[v][ 0 ];i ++ )
            
if (find(link[v][i])){
                link[v][i]
= u;
                
return   true ;
            }
    }
    
return   false ;
}
bool  chk(){
    
int  ans = 0 ;
    
for ( int  i = 0 ;i < m;i ++ )link[i][ 0 ] = 0 ;
    
for ( int  i = 0 ;i < n;i ++ ){
        memset(vi,
0 , sizeof (vi));
        
if ( ! find(i)) return   false ;
    }
    
return   true ;
}
int  main(){
    
char  str[ 20 ],ch;
    
while (scanf( " %d%d " , & n, & m),n){
        memset(G,
- 1 , sizeof (G));
        alloc
= 0 ;
        
for ( int  i = 0 ;i < n;i ++ ){
            scanf(
" %s " ,str);
            
while ( 1 ){
                
while (ch = getchar(),ch == '   ' );                
                
int  tmp = ch - ' 0 ' ;
                
while (ch = getchar(),ch <= ' 9 ' && ch >= ' 0 ' )tmp = 10 * tmp + ch - ' 0 ' ;
                add(i,tmp);
                
if (ch == ' \n ' || ch == EOF) break ;
            }
        }
        
int  low = 0 ,high = n + 1 ;
        
while (high - low > 1 ){
            
int  mid = (high + low) >> 1 ;
            N
= mid;
            
if (chk())high = mid;
            
else  low = mid;
        }
        printf(
" %d\n " ,high);
    }
    
return   0 ;
}