program fronta; const max = 20000; type pole = array [1..max] of integer; dpole = ^pole; matfyzak = record znamych: integer; znami: dpole; {seznam lidí ve frontě, které matfyzák zná} aktivni: integer; {informace o tom, je-li matfyzák již odbytý či ne} end; {pole matfyzáků / graf, reprezentovaný vrcholy se seznamy sousedů} matfyzaci = array[1..max] of matfyzak; var usporadani: pole; mela: matfyzaci; vpozice: integer; {první volná pozice v poli uspořádání} kruznice: integer; {průchod do hloubky, vrátí 0 pokud je vše OK, 1 pokud byla nalezena or. kružnice} procedure DFS( v: integer); var n: integer; i: integer; begin; n := 0; mela[v].aktivni := 1; if vpozice > max then exit; for i := 1 to mela[v].znamych do begin; if mela[ mela[v].znami^[i] ].aktivni = 1 then kruznice := 1 { detekována kružnice } else if mela[ mela[v].znami^[i] ].aktivni = 2 then continue { vrchol již hotov } else DFS(mela[v].znami^[i]); if kruznice = 1 then exit; end; {jsme-li tu, kružnice nebyla nalezena} usporadani[vpozice] := v; {deaktivuj vrchol a ulož jej do uspořádání} vpozice := vpozice + 1; mela[v].aktivni := 2; end; var pocet: integer; z: integer; m: integer; begin; read(pocet); {vstup} for m := 1 to pocet do begin; mela[m].aktivni := 0; read(mela[m].znamych); getmem(mela[m].znami, mela[m].znamych * sizeof(integer)); for z := 1 to mela[m].znamych do begin; read(mela[m].znami^[z]); end; end; vpozice := 1; {spuštění} kruznice := 0; for m := 1 to pocet do begin; if mela[m].aktivni = 0 then begin; DFS(m); end; if (kruznice = 1) or (vpozice > max) then break; end; if kruznice = 1 then write('no') else {výstup} for z := pocet downto 1 do write(usporadani[z],' '); writeln; end.