并差集
#include <stdio.h>

int stu[50005];

void make ( int n )
{
    
    
for ( int i=0; i<n; i++ )
    
{
        stu[i] 
= -1;
    }

}


int find ( int a )
{
    
    
if ( stu[a] < 0 )
    
{
        
return a;
    }

    
int root = find ( stu[a] );
    stu[a] 
= root;
    
    
return root;
}


void un ( int a, int b )
{
    
    
int ra = find ( a );
    
int rb = find ( b );

    stu[rb] 
= ra;
}


int main ()
{
    
    
int n, m;
    
int c = 0;
    
    
while ( scanf ( "%d%d"&n, &m ) != EOF )
    
{
        
if ( n == 0 && m == 0 )
        
{
            
break;
        }

        make ( n );
        
for ( int i=0; i<m; i++ )
        
{
            
int l, r;
            scanf ( 
"%d%d"&l, &r );
            
            
if ( find ( l-1 ) != find ( r-1 ) )
            
{
                un ( l
-1, r-1 );
            }

        }

        
int count = 0;
        
for ( i=0; i<n; i++ )
        
{
            
if ( stu[i] < 0 )
            
{
                count 
++;
            }

        }

        printf ( 
"Case %d: %d\n"++c, count );
    }

    
return 0;
}