← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n int
	if _, err := fmt.Fscan(in, &n); err != nil {
		return
	}

	type Edge struct {
		to int
		id int
	}
	adj := make([][]Edge, n+1)
	edges := make([]struct{ u, v int }, n)

	for i := 1; i < n; i++ {
		var u, v int
		fmt.Fscan(in, &u, &v)
		adj[u] = append(adj[u], Edge{v, i})
		adj[v] = append(adj[v], Edge{u, i})
		edges[i] = struct{ u, v int }{u, v}
	}

	target := make(map[int]map[int]float64)
	for i := 1; i < n; i++ {
		target[i] = make(map[int]float64)
	}

	queue := []int{1}
	visited := make([]bool, n+1)
	visited[1] = true

	for len(queue) > 0 {
		u := queue[0]
		queue = queue[1:]

		du := len(adj[u])
		if du == 0 {
			continue
		}

		var fixedTime float64 = 0
		var fixedEdgeId int = -1

		for _, e := range adj[u] {
			if val, ok := target[e.id][u]; ok {
				fixedTime = val
				fixedEdgeId = e.id
				break
			}
		}

		assignIdx := 1
		if fixedEdgeId == -1 {
			assignIdx = 0
		}

		for _, e := range adj[u] {
			if e.id == fixedEdgeId {
				continue
			}
			t := fixedTime + float64(assignIdx)*2.0/float64(du)
			for t >= 2.0 {
				t -= 2.0
			}
			target[e.id][u] = t
			
			tTo := t + 1.0
			for tTo >= 2.0 {
				tTo -= 2.0
			}
			target[e.id][e.to] = tTo
			
			assignIdx++
		}

		for _, e := range adj[u] {
			if !visited[e.to] {
				visited[e.to] = true
				queue = append(queue, e.to)
			}
		}
	}

	fmt.Fprintln(out, n-1)
	for i := 1; i < n; i++ {
		u := edges[i].u
		v := edges[i].v
		T := target[i][u]

		var printU, printV int
		var x float64

		if T <= 1.0 {
			printU = v
			printV = u
			x = 1.0 - T
		} else {
			printU = u
			printV = v
			x = 2.0 - T
		}

		if x < 0.0 {
			x = 0.0
		} else if x > 1.0 {
			x = 1.0
		}

		fmt.Fprintf(out, "1 %d %d %d %.9f\n", i, printU, printV, x)
	}
}