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)
}
}