var i,k:Word;
x:string;
litere:array[1..52]of Char;
function lit_urm(x:Char):Char;
begin
if x<>'Z'
then lit_urm:=Succ(x)
else lit_urm:='a'
end;
function lit_prec(x:Char):Char;
begin
if x<>'a'
then lit_prec:=Pred(x)
else lit_prec:='Z'
end;
function inferior(k:Word; x:string):string;
var i,j:Word;
testjos:Boolean;
begin
inferior:='null';
if Length(x)>k
then x:=Copy(x,1,k) { trunchiere }
else
for i:=1 to k-Length(x) do x:=x+'A';
{ completare }
testjos:=true;
for i:=1 to k do
begin
if testjos
then begin { test jos: }
if x[i]<litere[i] then Exit;
if x[i]>litere[i]
then testjos:=false;
end;
if x[i]>litere[52+i-k] { test sus: }
then begin
for j:=i to k do
x[j]:=litere[52+j-k];
inferior:=x;
Exit
end;
if i>1
then { test de ordine: }
if x[i]<=x[i-1]
then
begin
repeat Dec(i)
until(i=1)or(x[i]>lit_urm(x[i-1]));
x[i]:=lit_prec(x[i]);
{ decrementare }
for j:=i+1 to k do
x[j]:=litere[52+j-k];
inferior:=x;
Exit
end
end;
inferior:=x
end;
function superior(k:Word; x:string):string;
var i,j:Word;
ok,testsus:Boolean;
begin
superior:='null';
if Length(x)>k
then
begin
x:=Copy(x,1,k); { trunchiere }
ok:=false;
for i:=k downto 1 do
if x[i]<'z'
then begin ok:=true; Break end;
if not ok then Exit;
{ nu putem incrementa }
x[i]:=lit_urm(x[i]);
for j:=i+1to k do x[j]:='A';
{ incrementare }
end
else for i:=1 to k-Length(x) do x:=x+'A';
{ completare }
testsus:=x[1]>=litere[53-k];
for i:=1 to k do
begin
if testsus
then if x[i]>litere[52+i-k] then Exit;
if i>1
then { test de ordine: }
if x[i]<=x[i-1]
then
begin
x[i]:=x[i-1];
while x[i]>=litere[52+i-k] do
Dec(i);x[i]:=lit_urm(x[i]);
{ incrementare }
for j:=i+1 to k do
x[j]:=lit_urm(x[j-1]);
superior:=x; Exit
end;
end;
superior:=x;
end;
Begin
for i:=1 to 26 do
begin
litere[i]:=Chr(i-1+Ord('A'));
litere[i+26]:=Chr(i-1+Ord('a'))
end;
Assign(input,'G.DAT'); Reset(input);
while not SeekEof do
begin
Read(k);
if SeekEof then;
Readln(x);
Writeln('inferior = ',inferior(k,x));
Writeln('superior = ',superior(k,x));
Writeln
end;
Close(input)
End.