package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var t int
fmt.Fscan(in, &t)
for test := 0; test < t; test++ {
var n int
fmt.Fscan(in, &n)
head := make([]int, n+1)
for i := 1; i <= n; i++ {
head[i] = -1
}
to := make([]int, 2*n)
next := make([]int, 2*n)
edgeIdx := make([]int, 2*n)
deg := make([]int, n+1)
edgeCnt := 0
addEdge := func(u, v, idx int) {
to[edgeCnt] = v
edgeIdx[edgeCnt] = idx
next[edgeCnt] = head[u]
head[u] = edgeCnt
edgeCnt++
}
possible := true
for i := 1; i < n; i++ {
var u, v int
fmt.Fscan(in, &u, &v)
addEdge(u, v, i)
addEdge(v, u, i)
deg[u]++
deg[v]++
if deg[u] > 2 || deg[v] > 2 {
possible = false
}
}
if !possible {
fmt.Fprintln(out, -1)
continue
}
start := 1
for i := 1; i <= n; i++ {
if deg[i] == 1 {
start = i
break
}
}
ans := make([]int, n)
u := start
p := -1
val := 2
for {
moved := false
for e := head[u]; e != -1; e = next[e] {
v := to[e]
if v != p {
ans[edgeIdx[e]] = val
val = 5 - val
p = u
u = v
moved = true
break
}
}
if !moved {
break
}
}
for i := 1; i < n; i++ {
if i > 1 {
fmt.Fprint(out, " ")
}
fmt.Fprint(out, ans[i])
}
fmt.Fprintln(out)
}
}