program S62;

var
  s : string;
  code : integer;
  f : text;
  labdakszama, ciklus : byte;
  csoatmeroje : real;
  labdak : array[1..30] of real;
  maszk : array[1..30] of boolean;
  sorrend, vsorrend : array[1..30] of byte;
  vmagassag : real;

procedure atadas;

var
  pciklus : byte;

begin
  for pciklus := 1 to labdakszama do vsorrend[pciklus] := sorrend[pciklus];
end;

function magassag : real;

var
  fmagassag : real;
  fciklus : byte;

begin
  fmagassag := labdak[sorrend[1]];
  for fciklus := 1 to labdakszama-1 do
    fmagassag := fmagassag + sqrt(sqr(labdak[sorrend[fciklus]] + labdak[sorrend[fciklus+1]]) - sqr(csoatmeroje - labdak[sorrend[fciklus]] - labdak[sorrend[fciklus+1]]));
  fmagassag := fmagassag + labdak[sorrend[labdakszama]];
  magassag := fmagassag;
end;

procedure rekurzio(phely : byte);

var
  pciklus : byte;

begin
  if (phely <= labdakszama) then begin
    for pciklus := 1 to labdakszama do if not maszk[pciklus] then begin
      maszk[pciklus] := true;
      sorrend[phely] := pciklus;
      rekurzio(phely+1);
      maszk[pciklus] := false;
    end;
  end;
  if (phely > labdakszama) and (magassag < vmagassag) then begin
    vmagassag := magassag;
    atadas;
  end;
end;

begin
  if (paramcount < 1) then exit;
  assign(f, paramstr(1));
  {$I+}
  reset(f);
  readln(f, s);
  val(copy(s, 1, pos(#32, s)-1), labdakszama, code);
  delete(s, 1, pos(#32, s));
  val(s, csoatmeroje, code);
  for ciklus := 1 to labdakszama do begin
    readln(f, s);
    val(s, labdak[ciklus], code);
  end;
  {$I-}
  close(f);
  vmagassag := 65535;
  fillchar(maszk, sizeof(maszk), 0);
  rekurzio(1);
  for ciklus := 1 to labdakszama do write(labdak[vsorrend[ciklus]]:1:2, #32);
  writeln;
  writeln(vmagassag:1:6);
end.
