program wp08zad1;

var aktualny : Char;
    jestNieterminalem : array ['A' .. 'Z'] of Boolean;
    jestTerminalem : array ['a' .. 'z'] of Boolean;

procedure sprawdz(warunek : Boolean);
begin
    if not warunek then begin
        writeln('Bledne dane');
        halt
    end
end;

function nastepny : Char;
begin
    read(aktualny);
    nastepny := aktualny
end;

begin
    for aktualny := 'A' to 'Z' do
        jestNieterminalem[aktualny] := false;
    for aktualny := 'a' to 'z' do
        jestTerminalem[aktualny] := false;
    sprawdz(nastepny = '<');
    sprawdz(nastepny = '{');
    repeat
        sprawdz(nastepny in ['A'..'Z']);
        jestNieterminalem[aktualny] := true
    until nastepny <> ',';
    sprawdz(aktualny = '}');
    sprawdz(nastepny = ',');
    sprawdz(nastepny = '{');
    read(aktualny);
    while aktualny <> '}' do begin
        sprawdz(aktualny in ['a' .. 'z']);
        jestTerminalem[aktualny] := true;
        if nastepny = ',' then
            sprawdz(nastepny <> '}')
    end;
    sprawdz(nastepny = ',');
    sprawdz(nastepny = '{');
    read(aktualny);
    while aktualny <> '}' do begin
        sprawdz(aktualny in ['A' .. 'Z']);
        sprawdz(jestNieterminalem[aktualny]);
        sprawdz(nastepny = '-');
        sprawdz(nastepny = '>');
        while nastepny in ['A' .. 'Z', 'a' .. 'z', '|'] do
            if aktualny in ['A' .. 'Z'] then
                sprawdz(jestNieterminalem[aktualny])
            else if aktualny in ['a' .. 'z'] then
                sprawdz(jestTerminalem[aktualny]);
        if aktualny = ',' then
            sprawdz(nastepny <> '}')
    end;
    sprawdz(nastepny = ',');
    sprawdz(nastepny in ['A' .. 'Z']);
    sprawdz(jestNieterminalem[aktualny]);
    sprawdz(nastepny = '>');
    sprawdz(eoln);
    writeln('Poprawne dane')
end.
