{ J.Blonskis. Naudojama gretutinumo matrica }
program VirusasA;
const Cn = 50;           { Maksimalus viršūnių skaičius}
type  Mas = array[1..Cn] of boolean;
      Mtr = array[1..Cn] of Mas;
const  CD = 'virus.dat';   {Duomenų failo vardas  }
       CR = 'virus.re';        {Rezultatų failo vardas}
var   K : Mtr; n  : integer;  {Gretutinumo matrica   }
      F1, F2, Kv  : Mas;      {Frontų registracija ir viršūnių sąrašas}
      A, B, t     : integer;  {Starto ir tikslo viršūnės, laikas}
      R : text;
{--------------------------------------------------}
procedure Valo( var A : Mas); {Masyvą užpildo loginiu nuliu}
var i : integer;
begin
  for i := 1 to n do A[i] := False;
end;
{--------------------------------------------------}
procedure Duomenys;             {Duomenų skaitymas }
var i, j : integer;  F : text;
    sim  : char;     v, v1, m : integer;
begin
 for i := 1 to n do Valo(K[i]);   {Valoma matrica}
 Valo(F1);  Valo(F2);  Valo( Kv); {Valomi frontai ir viršūnių sąrašas}
 Assign(F, CD);  Reset(F);
 ReadLn(F, n, A, B);              {Viršūnių skaičius, starto ir tikslo viršūnės}
 for i := 1 to n do  begin
   Read(F, sim, v, m);            {Viršūnės tipas, numeris ir ryšių skaičius   }
   if sim = 'T' then Kv[v] := True; {Viršūnės tipas pažymimas sąraše }
    for j := 1 to m do begin      {Skaitomi ryšiai}
      Read(F, v1);                {Ryšio viršūnė  }
      K[v, v1] := True;   K[v1, v] := True; {Ryšio tarp viršūnių atžyma matricoje}
    end;
      ReadLn(F);                  {Perėjimas į naują eilutę }
 end;
 Close(F);
end;
{--------------------------------------------------}
function ArYra: boolean;
begin
  ArYra := F2[B];   {Tikrinama, ar tikslas pasiektas}
end;
{--------------------------------------------------}
function ArTuscias: boolean;
var yra : boolean;  i : integer;
begin        {Tikrinama, ar dar yra kelias nors į vieną viršūnę}
    yra := False;  i := 1;
    while not yra and (i <= n) do
      if F2[i]  then yra := True
                else i := i +1;
    ArTuscias := yra;
end;
{--------------------------------------------------}
procedure Zingsnis;         {Vienas viruso žingsnis}
var i, j : integer;
begin
  for i := 1 to n do        {Senojo fronto sąrašo peržiūra}
    if F1[i] then           {Virusas startuoja            }
      for j := 1 to n do    {Ryšių peržiūra               }
         if K[i,j] then begin {Nauja viršūnė: atžyma naujame fronte; šalinamas ryšys}
               F2[j] := True;  K[i,j] := False;  K[j,i] := False;
                        end;
  for i := 1 to n do  {Iš naujo fronto šalinamos viršūnės, turinčios antivirusinę apsaugą}
     if F2[i] and Kv[i] and not F2[B] then
        begin Kv[i] := False; F2[i] := False; end;
end;
{--------------------------------------------------}
procedure F2Tvarko; {Koreguojamas naujo fronto viršūnių sąrašas }
var i, j : integer; yra : boolean;
begin			{Jeigu iš F1[i] viršūnės tolesnių ryšių nėra, tai ji
                         pašalinama iš fronto sąrašo            }
   for i := 1 to n do
      if F2[i] then begin
         yra := False;  j := 1;
         while not yra and (j <= n)  do
           if K[i,j] then yra := True
                     else j := j + 1;
         if not yra and not F2[B] then F2[i] := False;
      end;
end;
{--------------------------------------------------}
procedure Darbas; {Viruso plitimo organizavimas    }
begin
  F2[A] := True;  {Startas}
  t := 0;         {Laikas }
  while not ArYra and ArTuscias do begin {Tikslas nepasiektas, bet dar paieška galima}
    t := t + 1;           {Dar vienas žingsnis   }
    F1 := F2;  Valo(F2);  {Fronto pakeitimas     }
    Zingsnis;             {Vienas viruso žingsnis}
    F2Tvarko;             {Naujo fronto sąrašo korekcija}
    end;
end;
{--------------------------------------------------}
begin
  Assign(R, CR);  Rewrite(R);
  Duomenys;
  Darbas;
  if ArYra then Write(R, 'T ', t)
           else Write(R, 'N ', t);
  Close(R);
end.
