Program gfdg;
const M=501;
type pole= array [1..M] of integer;

var p1,p2,p3,p4,p5:pole;
    i,j,n:integer;
    c,oper:char;

procedure tisk(p:pole);
var i:integer;
begin
{  for i:=p[m] downto 1 do write(p[i]);
writeln;}
end;

procedure tisk2(p:pole;k:integer);
var i:integer;
begin
  for i:=1 to k-p[m] do write(' ');
  for i:=p[m] downto 1 do write(p[i]);
writeln;
end;

procedure tisk3(p:pole;k:integer;c:char);
var i:integer;
begin
  for i:=1 to k-p[m]-1 do write(' ');
  write(c);
  for i:=p[m] downto 1 do write(p[i]);
writeln;
end;

procedure cara(l,k:integer);
var i:integer;
begin
  for i:=1 to l do write(' ');
  for i:=k-l downto 1 do write('-');
  writeln;
end;



procedure plusko(var p1,p2,p3:pole);
var i,max,posun,pom:integer;
begin
  if p1[M]>p2[M] then max:=p1[M] else max:=p2[M];
  {nulovani neni zatimn}
  for i:=p1[M]+1 to max do p1[i]:=0;
  for i:=p2[M]+1 to max do p2[i]:=0;
  posun:=0;
  for i:=1 to max do
  begin
    pom:=p1[i]+p2[i]+posun;
     posun := pom div 10;
     p3[i]:=pom mod 10;
  end;
  if posun>0 then begin p3[i+1]:=posun; p3[M]:=max+1; end
  else p3[M]:=max;
end;


procedure minusko(var p1,p2,p3:pole);
var i,max,posun,pom:integer;
begin
  if p1[M]>p2[M] then max:=p1[M] else max:=p2[M];
  {nulovani neni zatimn}
  for i:=p1[M]+1 to max do p1[i]:=0;
  for i:=p2[M]+1 to max do p2[i]:=0;
  posun:=0;
  for i:=1 to max do
  begin
     pom:=p1[i]-p2[i]-posun;
     if pom<0 then begin
       posun := 1 ;  p3[i]:=pom+10;
     end else begin posun:=0; p3[i]:=pom; end;
  end;
  p3[M]:=max;
  for i:=max downto 1 do
    if p3[i]=0 then dec(p3[M]) else break;
  
end;

procedure nasob1(var p1,p3:pole; a:integer);
var pom,i,posun,max:integer;
begin
  posun:=0; max:=p1[M];
  for i:=1 to max do
  begin
    pom:=a*p1[i]+posun;
     posun := pom div 10;
     p3[i]:=pom mod 10;
  end;
  if posun>0 then begin p3[i+1]:=posun; p3[M]:=max+1; end
  else p3[M]:=max;
end;

procedure nasob(var p1,p2,p3:pole;vypis:boolean;k:integer);
var pom,i,max,posun:integer;
   p4,p5:pole;
begin

  if k=p2[m] then inc(k);
  if vypis then
  begin
    if p1[M]>p2[M]+1 then max:=p1[m] else max:=p2[m]+1;
    tisk2(p1,max);
    tisk3(p2,max,'*');
    cara(k-max,k);
  end;
  


  max:=p2[M];
  p3[1]:=0; p3[M]:=1;
  for i:=1 to max do
  begin
    if p2[i]<>0 then nasob1(p1,p4,p2[i]);

    if vypis and (p2[M]>1) then
    begin
      tisk2(p4,k-i+1);
    end;

    for j:=p4[M] downto 1 do p4[j+i-1]:=p4[j];
    for j:=1 to i-1 do p4[j]:=0;
    p4[M]:=p4[M]+i-1;
{    tisk(p4);}
    plusko(p3,p4,p5);
    p3:=p5;
  end;

if vypis then begin
   cara(0,k);
   tisk2(p3,k);
end;

end;



var pom,max:integer;

begin		        
{  readln (n);} n:=1;
for i:=1 to n do 
begin				
  read(c);
  j:=1;
  while (c<>'+')and(c<>'-')and(c<>'*') do begin
     p1[j]:=ord(c)-ord('0'); 
     j:=j+1; 
     read(c);
  end;
  p1[M]:=j-1;
  oper:=c;
  read(c);
  j:=1;
  while not eoln do begin
    p2[j]:=ord(c)-ord('0');
    j:=j+1;
    read(c);
  end;
  p2[j]:=ord(c)-ord('0');    
  p2[M]:=j;
  for j:=1 to p1[M] div 2 do
    begin pom:= p1[j]; p1[j]:=p1[p1[M]-j+1]; p1[p1[M]-j+1]:=pom; end;
  for j:=1 to p2[M] div 2 do
    begin pom:= p2[j]; p2[j]:=p2[p2[M]-j+1]; p2[p2[M]-j+1]:=pom; end;
  tisk(p1); tisk(p2);
  if oper='+' then plusko(p1,p2,p5);
  if oper='-' then minusko(p1,p2,p5);
  if oper='*' then begin 
     nasob(p1,p2,p5,false,0);
     tisk(p5);
     nasob(p1,p2,p5,p2[M]>1,p5[M]);
    end;

  if (oper='+') or (oper='-') or ((oper='*') and (p2[M]=1)) then
  begin
    if p1[M]>p2[M]+1 then max:=p1[M] else max:=p2[M]+1;
    if max<p5[M] then max:=p5[M];
    tisk2(p1,max);
    tisk3(p2,max,oper);
    cara(0,max);
    tisk2(p5,max);
  end;



 tisk(p5);
  
{  writeln(a,vysl[501]);}
{  for j:=vysl[501] downto 1 do write(vysl[j]);}
{  writeln(p2[M],',',p1[M]);}
end;
end.
