function PosBlank(s: string; cursor: integer): integer;{Возвращает позицию первого пробельного символа в строке s, начиная с позиции, указанной cursor. Если такого символа нет, возвращает 0.}var n: integer;begin n := Length(s); while (s[cursor] <> ' ') and (cursor < n) do cursor := cursor + 1; if cursor = n then if s[cursor] = ' ' then PosBlank := n else PosBlank := 0 else PosBlank := cursorend;function PosNonBlank(s: string; cursor: integer): integer;{Возвращает позицию первого непробельного символа в строке s, начиная с позиции, указанной cursor. Если такого символа нет, возвращает 0.}var n: integer;begin n := Length(s); while (s[cursor] = ' ') and (cursor < n) do cursor := cursor + 1; if cursor = n then if s[cursor] = ' ' then PosNonBlank := 0 else PosNonBlank := n else PosNonBlank := cursorend;procedure GetWord(s: string; var cursor: integer; var wd: string);{Процедура помещает в wd очередное слово из строки s Начало слова указано в cursor, после завершения процедуры cursor будет указывать на первый пробельный символ, следующий за найденным словом. Лидирующие и хвостовые пробельные символы усекаются. Если слово не найдено, то в wd помещается пустая строка}var n, ibegin: integer;begin n := length(s); if n>0 then begin cursor := PosNonBlank(s, cursor); if cursor > 0 then begin ibegin := cursor; cursor := PosBlank(s, cursor); if cursor > 0 then wd := Copy(s, ibegin, cursor - ibegin) else wd := Copy(s, ibegin, n - ibegin + 1) end else wd := '' end else begin wd:=''; cursor:=0 endend;var c, cc, w: string; ic: integer; fin, fout: Text;begin Assign(fin, 'input.txt'); Reset(fin); Assign(fout, 'output.txt'); Rewrite(fout); while not Eof(fin) do begin ic := 1; cc := ''; readln(fin, c); while ic > 0 do begin GetWord(c, ic, w); if w <> '' then cc := cc + ' ' + w end; cc := Copy(cc, 2, length(cc) - 1); writeln(fout, cc) end; Close(fin); Close(fout);end.