{$R+,Q+}
{$APPTYPE CONSOLE}

const
  NMAX = 121;

type
  TArray = array[0..NMAX,1..NMAX] of LongInt;
  PArray = ^TArray;
  TVector = array[0..NMAX] of longint;

var
  n,k: longint;
  first: TVector; //начальное разложение
  fcnt,fnum: longint;
  r: PArray; //для подсчёта количеств разложений
  i,j,tmp: longint;
  ch: char;

function min(a,b: longint): longint;
begin
  if a<b then min:=a else min:=b;
end;

{подсчет количеств разложений}
procedure Init;
var
  i,j,l: longint; 
begin
  new(r);
  for j:=1 to N do r^[0,j]:=1;
  for i:=1 to N do
   for j:=1 to N do
   begin
     r^[i,j] := 0;
     for l:=1 to min(j,i) do r^[i,j]:=r^[i,j]+r^[i-l,l];
  end;
end;

//получить разложение с заданным номером
function GetRazl(n: longint; k: longint; var v: TVector; var i: longint): boolean;
//n-что раскладываем, k-какое по счёту, v-куда записать, i-число получившихся слагаемых
var
  cnt,j,sum,norig: LongInt;
begin
  if k>r^[n,n] then begin
    GetRazl := false;
    exit;
  end;
  norig:=n;
  GetRazl := true;
  i:=0;
  v[0]:=n;
  sum:=0;
  repeat
    inc(i);
    for j:=1 to v[i-1] do begin //превышать предыдущий член мы не можем
      cnt := r^[n-j,j]; //сколько различных разложений с первым слагаемым n-j, не превосходящих j
      if cnt<k then begin k:=k-cnt; continue; end;
      v[i]:=j; sum:=sum+v[i]; break;
    end;
    n:=n-v[i]; //уменьшаем оставшуюся сумму на очередное слагаемое
  until sum=norig;
end;

{срввнений двух разложений}
function cmp(v1:TVector; v1cnt: longint; v2: TVector; v2cnt: longint): longint;
var
  i,cnt: longint;
begin
  if v1cnt<v2cnt then cnt:=v1cnt else cnt:=v2cnt;
  for i:=1 to cnt do begin
    if v1[i]<v2[i] then begin cmp:=-1; exit; end;
    if v1[i]>v2[i] then begin cmp:=+1; exit; end;
  end;
  cmp:=0;
end;

{определить номер заданного разложения}
function NumByRazl(v: TVector; vcnt:longint): longint;
var
  vec: TVector;
  veccnt,left,right,middle,res: longint;
begin
  left:=1; right:=r^[n,n];
  repeat
    middle := left+(right-left) div 2;
    GetRazl(n,middle,vec,veccnt);
    res := cmp(vec,veccnt,v,vcnt);
    if res=0 then begin NumByRazl := middle; exit; end;
    if res<0 then left:=middle+1 else right:=middle-1;
  until left>right;
  NumByRazl := -1;
end;

begin

//  assign(input,'input.txt'); reset(input);
//  assign(output,'output.txt'); rewrite(output);

  {input}
  n:=0; tmp:=0; fcnt := 0;
  while not seekeoln do
  begin
    read(ch);
    case ch of
    '0'..'9': tmp:=tmp*10+ord(ch)-ord('0');
    '+': begin inc(fcnt); first[fcnt]:=tmp; n:=n+tmp; tmp:=0; end;
    end;
  end;
  inc(fcnt); first[fcnt]:=tmp; n:=n+tmp;
  readln(k);

  {sorting}
  for i:=1 to fcnt-1 do
    for j:=fcnt downto i+1 do
      if first[j-1]<first[j] then
      begin
        tmp:=first[j-1]; first[j-1]:=first[j]; first[j]:=tmp;
      end;

  init;
  fnum := NumByRazl(first,fcnt); {определяем номер нашего разложения}
  if k>r^[n,n]-fnum then begin writeln('Impossible'); exit; end;
  k:=k+fnum; {определяем номер разложения, которое надо вывести}
  GetRazl(n,k,first,fcnt); {определяем разложение по его номеру}

  for i:=1 to fcnt-1 do write(first[i],'+'); writeln(first[fcnt]);

end.
