Problem:
Score : 400 points

Problem Statement

Given is a tree G with N vertices.
The vertices are numbered 1 through N, and the i-th edge connects Vertex a_i and Vertex b_i.

Consider painting the edges in G with some number of colors.
We want to paint them so that, for each vertex, the colors of the edges incident to that vertex are all different.

Among the colorings satisfying the condition above, construct one that uses the minimum number of colors.

Constraints

2 \le N \le 10^5

1 \le a_i \lt b_i \le N

All values in input are integers.

The given graph is a tree.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
a_2 b_2
\vdots
a_{N-1} b_{N-1}

Output

Print N lines.

The first line should contain K, the number of colors used.

The (i+1)-th line (1 \le i \le N-1) should contain c_i, the integer representing the color of the i-th edge, where 1 \le c_i \le K must hold.

If there are multiple colorings with the minimum number of colors that satisfy the condition, printing any of them will be accepted.

Sample Input 1

3
1 2
2 3

Sample Output 1

2
1
2

Sample Input 2

8
1 2
2 3
2 4
2 5
4 7
5 6
6 8

Sample Output 2

4
1
2
3
4
1
1
2

Sample Input 3

6
1 2
1 3
1 4
1 5
1 6

Sample Output 3

5
1
2
3
4
5

Solution in LuaJIT (2.0.4) (judge verdict: Accepted)

local n = io.read("*n")
local nodecol = {}
local edgecol = {}
local edge = {}
for i = 1, n do
  nodecol[i] = 0
  edge[i] = {}
end
for i = 1, n - 1 do
  edgecol[i] = 0
  local a, b = io.read("*n", "*n")
  edge[a][b] = i
  edge[b][a] = i
end
local snode = 0
for i = 1, n do
  local edgecnt = 0
  for k, v in pairs(edge[i]) do
    edgecnt = edgecnt + 1
  end
  if edgecnt == 1 then
    snode = i
    break
  end
end
nodecol[snode] = 1
local tasknode = {}
for dstnode, edgeid in pairs(edge[snode]) do
  nodecol[dstnode] = 1
  edgecol[edgeid] = 1
  table.insert(tasknode, dstnode)
end
local maxcol = 1
local mma = math.max
for i = 1, n - 1 do
  local srcnode = tasknode[i]
  local srccol = nodecol[srcnode]
  local curcol = 1
  for dstnode, edgeid in pairs(edge[srcnode]) do
    if nodecol[dstnode] == 0 then
      if curcol == srccol then curcol = curcol + 1 end
      nodecol[dstnode] = curcol
      edgecol[edgeid] = curcol
      maxcol = mma(maxcol, curcol)
      table.insert(tasknode, dstnode)
      curcol = curcol + 1
    end
  end
end
print(maxcol)
for i = 1, n - 1 do
  print(edgecol[i])
end