{$A+,B-,D+,E+,F-,G+,I+,L+,N+,O-,P-,Q-,R+,S+,T-,V+,X+}
{$M 16384,0,655360}
{ Решение задачи про знакомства.}
{ Личное первенство УрГУ-2000 }
{ Васильев С.Н.}

const max=2000;
var m:array[1..max] of integer; { Краски для компонент связности}
p:array[1..max] of boolean;     { Признак использования краски}

i,j,k,N,a:integer; fin,fout:text;

procedure replace_l_with_k(l,k:integer);
var count:integer;
begin
 for count:=1 to N do if m[count]=l then m[count]:=k;
end;

begin
 assign(fin,'input.txt'); reset(fin);
 read(fin,N);
 for i:=1 to N do m[i]:=-1;
 for i:=1 to N do
  begin
   readln(fin);
   if m[i]=-1 then m[i]:=i;       { Вводим новую краску для компоненты связности если она не покрашена}
   k:=m[i];                       { Определяем, каким цветом красить}
   while not(eoln(fin)) do
    begin
     read(fin,a);
     if (m[a]=-1) or (m[a]=k)     { Красим в нужный цвет если не покрашено}
      then m[a]:=k
       else replace_l_with_k(m[a],k); { Перекрашиваем компоненту связности если покрашено другим цветом}
    end;
  end;
 close(fin);
 for i:=1 to N do p[i]:=false;
 for i:=1 to N do p[m[i]]:=true;       { Смотрим, какие цвета используются }
 j:=0;
 for i:=1 to N do if p[i] then inc(j); { Подсчет числа компонент связности}

 assign(fout,'output.txt');
 rewrite(fout);
 write(fout,j);
 close(fout);
end.