#include <iostream>
#include <iomanip>
#include <sstream>
#include <vector>
#include <string>
#include <set>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <iterator>
#include <limits>
#include <numeric>
#include <utility>
#include <cmath>
#include <cassert>
#include <cstdio>

using namespace std; using namespace placeholders;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector< int > VI;
typedef vector< vector< int > > VVI;
typedef vector< string > VS;
typedef stringstream SS;
typedef pair< int, int > PII;
typedef vector< pair< int, int > > VPII;
#define VT( T ) vector< T >
#define VVT( T ) vector< vector< T > >
#define LIM( T ) numeric_limits< T >

template < typename T > inline istream& operator>>( istream &s, vector< T > &v ){ for ( T &t : v ) { s >> t; } return s; }
template < typename T > inline ostream& operator<<( ostream &s, const vector< T > &v ){ for ( int i = 0; i < int( v.size() ); ++i ){ s << ( " " + !i ) << v[i]; } return s; }
template < typename T > inline T fromString( const string &s ) { T res; istringstream iss( s ); iss >> res; return res; };
template < typename T > inline string toString( const T &a ) { ostringstream oss; oss << a; return oss.str(); };

#define REP2( i, n ) REP3( i, 0, n )
#define REP3( i, m, n ) for ( int i = ( int )( m ); i < ( int )( n ); ++i )
#define GET_REP( a, b, c, F, ... ) F
#define REP( ... ) GET_REP( __VA_ARGS__, REP3, REP2 )( __VA_ARGS__ )
#define FOR( e, c ) for ( auto &e : c )
#define ALL( c ) ( c ).begin(), ( c ).end()
#define AALL( a, t ) ( t* )a, ( t* )a + sizeof( a ) / sizeof( t )
#define DRANGE( c, p ) ( c ).begin(), ( c ).begin() + p, ( c ).end()

#define SZ( v ) ( (int)( v ).size() )
#define PB push_back
#define EM emplace
#define EB emplace_back
#define BI back_inserter

#define EXIST( c, e ) ( ( c ).find( e ) != ( c ).end() )

#define MP make_pair
#define fst first
#define snd second

#define DUMP( x ) cerr << #x << " = " << ( x ) << endl

// 文字列 split / デリミタに含まれるいずれかの文字で分割
vector<string> split( const string &str, const string &delim = " " )
{
	int start = 0;
	vector<string> result;
	
	for ( int pos; ( pos = str.find_first_of( delim, start ) ) != (int)string::npos; start = pos + 1 )
	{
		result.push_back( str.substr( start, pos - start ) );
	}
	result.push_back( str.substr( start ) );

	result.erase(
			remove_if( result.begin(), result.end(), not1( mem_fun_ref( &string::size ) ) ),
			result.end() );

	return result;
}

map< string, VS > dp;
VS solve( const VS &groups, map< string, VS > &members, const string &group )
{
	if ( EXIST( dp, group ) )
	{
		return dp[ group ];
	}

	VS res;
	FOR( member, members[ group ] )
	{
		if ( EXIST( members, member ) )
		{
			VS tmp = solve( groups, members, member );
			copy( ALL( tmp ), BI( res ) );
		}
		else
		{
			res.PB( member );
		}
	}
	sort( ALL( res ) );
	res.erase( unique( ALL( res ) ), res.end() );
	return dp[ group ] = res;
}

int main()
{
	cin.tie( 0 );
	ios::sync_with_stdio( false );

	for ( int N; cin >> N && N; )
	{
		VS groups( N );
		map< string, VS > members;

		REP( i, N )
		{
			string s;
			cin >> s;

			const int colon = s.find( ':' );
			const string group = s.substr( 0, colon );

			string ms = s.substr( colon + 1 );
			ms.resize( SZ( ms ) - 1 );

			groups[i] = group;
			members[ group ] = split( ms, "," );
		}

		dp.clear();
		cout << SZ( solve( groups, members, groups[0] ) ) << endl;
	}

	return 0;
}

Measured memory_bytes: 1416