← Home
```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)
		}
	}
}
```