program town;
function max(p,q:longint):longint;
 {This function computes the maximumum of two given longints}
 begin
  if p>=q then max:=p else max:=q
 end;
 const MAXHEIGHT=5000;
 {The maximumum height of buildings is 5000 cubes}
var heights_front:array[0..MAXHEIGHT] of longint;
    heights_side:array[0..MAXHEIGHT] of longint;
    width,length:longint;
    higher_front,higher_side:longint;
    minimum,maximum:longint;
    possible:boolean;
    a,b:longint;
    f:text;
begin
 {Opening and reading the input file}
 assign(f,'TOWN.IN');
 reset(f);
 readln(f,width,length);
 for a:=0 to MAXHEIGHT do begin heights_front[a]:=0; heights_side[a]:=0; end;
 {Sorting heights of buildings using countsort while reading them}
 for a:=1 to width do begin readln(f,b); inc(heights_front[b]); end;
 for a:=1 to length do begin readln(f,b); inc(heights_side[b]); end;
 close(f);
 a:=MAXHEIGHT; {= the building height which we scan}
 possible:=true; {Can be the town built?}
 minimum:=0; maximum:=0; {How many cubes can Jack use?}
 higher_front:=0; higher_side:=0; {How many buildings are higher then a?}
 while (a>=0) and possible do
  {Scanning all possible heights of building}
  begin
   {Checking the possibility of building the town}
   possible:=not((higher_front=0) and (higher_side=0) and (
                 ((heights_front[a]<>0) and (heights_side[a]=0)) or
                 ((heights_front[a]=0) and (heights_side[a]<>0)) ));
   {Updating all variables}
   minimum:=minimum+max(heights_front[a],heights_side[a])*a;
   maximum:=maximum+higher_front*higher_side;
   higher_front:=higher_front+heights_front[a];
   higher_side:=higher_side+heights_side[a];
   dec(a);
  end;
 {Writing results to the output file}
 assign(f,'TOWN.OUT');
 rewrite(f);
 if possible then writeln(f,minimum,' ',maximum) else writeln(f,'No solution.');
 close(f);
end.
