```go
package main
import (
"bufio"
"fmt"
"math/bits"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var t int
if _, err := fmt.Fscan(reader, &t); err != nil {
return
}
for tc := 0; tc < t; tc++ {
var n int
fmt.Fscan(reader, &n)
numVertices := 1 << n
numEdges := n * (1 << (n - 1))
adj := make([][]int, numVertices)
for i := 0; i < numVertices; i++ {
adj[i] = make([]int, 0, n)
}
for i := 0; i < numEdges; i++ {
var u, v int
fmt.Fscan(reader, &u, &v)
adj[u] = append(adj[u], v)
adj[v] = append(adj[v], u)
}
P := make([]int, numVertices)
for i := range P {
P[i] = -1
}
P[0] = 0
if n > 0 {
for i := 0; i < n; i++ {
P[1<<i] = adj[0][i]
}
}
for x := 1; x < numVertices; x++ {
if bits.OnesCount(uint(x)) >= 2 {
b1, b2 := -1, -1
for i := 0; i < n; i++ {
if (x & (1 << i)) != 0 {
if b1 == -1 {
b1 = i
} else if b2 == -1 {
b2 = i
break
}
}
}
y := x ^ (1 << b1)
z := x ^ (1 << b2)
w := x ^ (1 << b1) ^ (1 << b2)
vy := P[y]
vz := P[z]
vw := P[w]
var px int
for _, u := range adj[vy] {
if u != vw {
found := false
for _, u2 := range adj[vz] {
if u == u2 {
found = true
break
}
}
if found {
px = u
break
}
}
}
P[x] = px
}
}
for i := 0; i < numVertices; i++ {
if i > 0 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, P[i])
}
fmt.Fprintln(writer)
if n&(n-1) != 0 {
fmt.Fprintln(writer, -1)
} else {
colorPerm := make([]int, numVertices)
for x := 0; x < numVertices; x++ {
c := 0
for i := 0; i < n; i++ {
if (x & (1 << i)) != 0 {
c ^= i
}
}
colorPerm[P[x]] = c
}
for i := 0; i < numVertices; i++ {
if i > 0 {
fmt.Fprint(writer, " ")
}
fmt.Fprint(writer, colorPerm[i])
}
fmt.Fprintln(writer)
}
}
}
```