let ($) f g = fun x -> g (f x)
let n = Scanf.sscanf (read_line ()) "%d" @@ fun n -> n
let ab = Array.init (n - 1) @@ fun _ -> Scanf.sscanf (read_line ()) "%d %d" @@ fun a b -> (a - 1, b - 1)

module IntMap = Map.Make(struct type t = int let compare = compare end)

let edges = 
  let add k v idx map =
    let vs = try IntMap.find k map with Not_found -> [] in
    IntMap.add k ((idx, v) :: vs) map in
  fst @@ Array.fold_left (fun (map, i) (a, b) ->
    (add b a i @@ add a b i map, i + 1)
  ) (IntMap.empty, 0) ab

let () =
  let arr = Array.make (n - 1) 0 in
  let used = Array.make n false in
  let k = IntMap.bindings edges |> List.map (snd $ List.length) |> List.fold_left max 0 in
  let que = Queue.create () in
  Queue.add (0, k + 1) que;
  while not (Queue.is_empty que) do
    let node, col = Queue.pop que in
    let children = IntMap.find node edges |> List.filter (fun (_, v) -> not used.(v)) |> List.rev in
    used.(node) <- true;
    List.iteri (fun idx (i, v) -> 
      let c = idx + if idx < col - 1 then 1 else 2 in
      arr.(i) <- c;
      Queue.add (v, c) que;
    ) children;

  done;
  Printf.printf "%d\n" k;
  Array.iter (Printf.printf "%d\n") arr;
