fun main(args: Array<String>) {
  val N = readInt()
  val abList = (2..N).map { readInts() }
  val graph = Graph(N)
  abList.forEach { graph.addEdge(it[0], it[1]) }
  val resultMap = mutableMapOf<Pair<Int, Int>, Int>()

  var maxNum = 0

  fun search(i: Int, from: Int, fromNum: Int) {
    val edgeSet = graph.getNode(i).edgeList
    var num = 1
    edgeSet.forEach { j ->
      if (j == from) return@forEach
      val a = Math.min(i, j)
      val b = Math.max(i, j)
      if (num == fromNum) num++
      resultMap[a to b] = num
      search(j, i, num)
      if (maxNum < num) maxNum = num
      num++
    }
  }
  search(1, 0, 0)
  println(maxNum)
  abList.forEach {
    println(resultMap[it[0] to it[1]])
  }
}

fun readString() = readLine()!!
fun readStrings() = readString().split(' ')
fun readInt() = readString().toInt()
fun readInts() = readStrings().map { it.toInt() }


class Node {
  //  val edgeSet = mutableSetOf<Int>()
  val edgeList = mutableListOf<Int>()
}

class Graph(nodeSize: Int) {
  private val nodeList = (1..nodeSize).map { Node() }
  fun getNode(id: Int) = nodeList[id - 1]
  fun addEdge(a: Int, b: Int) {
    getNode(a).edgeList.add(b)
    getNode(b).edgeList.add(a)
  }
}
