let apply_goal goal lists = 
  if ((List.length lists)=0) 
  then failwith "Trying to apply goal with an empty list"
  else try match goal with 
    | MaximizeTeams    -> List.hd (List.rev lists);
    | MinimizeTeams    -> List.hd (lists);
    | MaxLessEqualTo n -> 
        List.hd (List.rev (select (fun t -> (fst t) <= n) lists))
    | MinMoreEqualTo n -> 
        List.hd (select (fun t -> (fst t) >= n) lists)
  with _ -> failwith "Unable to apply such a goal"