import java.io.PrintWriter
import java.util.*

fun next() = readLine()!!
fun nextInt() = next().toInt()
fun nextLong() = next().toLong()
fun nextDouble() = next().toDouble()
fun nextList() = next().split(" ")
fun nextIntList() = nextList().map(String::toInt)
fun nextLongList() = nextList().map(String::toLong)
fun nextDoubleList() = nextList().map(String::toDouble)

val pw = PrintWriter(System.out)
fun print(s: Any = "") = pw.print(s)
fun println(s: Any = "") = pw.println(s)

fun <T> Iterable<T>.join(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "") = joinToString(separator, prefix, postfix)
fun <T> Array<T>.join(separator: CharSequence = ", ", prefix: CharSequence = "", postfix: CharSequence = "") = joinToString(separator, prefix, postfix)

fun main(args: Array<String>) {
    main()
    pw.flush()
}

fun main() {
    val N = nextInt()
    val G = Graph(N)
    repeat(N - 1) { i ->
        val (a, b) = nextIntList()
        G.addEdgeTwoWay(a, b, i)
    }
    G.edgeColors()
}

class Graph(private val V: Int) {
    private val vec = Array(V + 1) { mutableListOf<Edge>() }

    fun addEdgeTwoWay(a: Int, b: Int, index: Int) {
        vec[a].add(Edge(b, index))
        vec[b].add(Edge(a, index))
    }

    fun edgeColors() {
        val colors = IntArray(V - 1) { 0 }
        val que = ArrayDeque<Triple<Int, Int, Int>>()
        que.addLast(Triple(1, 0, Int.MAX_VALUE))
        while (que.size > 0) {
            val (v, pv, pc) = que.removeFirst()
            var cc = 1
            for ((to, index) in vec[v]) {
                if (to == pv) continue
                if (cc == pc) cc++
                colors[index] = cc
                que.addLast(Triple(to, v, cc))
                cc++
            }
        }
        println(colors.max()!!)
        println(colors.joinToString("\n"))
    }

    data class Edge(val to: Int, val index: Int)
}