← Home
package main
 
import (
   "bufio"
   "fmt"
   "os"
)
 
func main() {
   in := bufio.NewReader(os.Stdin)
   out := bufio.NewWriter(os.Stdout)
   defer out.Flush()
   var t int
   if _, err := fmt.Fscan(in, &t); err != nil {
       return
   }
   for t > 0 {
       t--
       solve(in, out)
   }
}
 
func solve(in *bufio.Reader, out *bufio.Writer) {
   var m int
   fmt.Fscan(in, &m)
   b := make([]int, m)
   cnt := [5]int{}
   for i := 0; i < m; i++ {
       fmt.Fscan(in, &b[i])
       c := b[i]
       if c > 4 {
           c = 4
       }
       cnt[c]++
   }
   if cnt[4] > 0 || cnt[3] >= 2 || (cnt[3] >= 1 && cnt[2] >= 1) || cnt[2] >= 3 {
       fmt.Fprintln(out, -1)
       return
   }
   v := make([]int, m)
   a := make([][]int, 0)
   // initial zero row
   row0 := make([]int, m)
   copy(row0, v)
   a = append(a, row0)
   check := make([]bool, m)
   if cnt[2] > 0 {
       p1, p2 := -1, -1
       for i := 0; i < m; i++ {
           if b[i] == 2 {
               if p1 != -1 {
                   p2 = i
               } else {
                   p1 = i
               }
           }
       }
       if p2 != -1 {
           insert2 := func(p1, p2, c1, c2 int) {
               v[p1] = c1
               v[p2] = c2
               row := make([]int, m)
               copy(row, v)
               a = append(a, row)
           }
           insert2(p1, p2, 2, 2)
           insert2(p1, p2, 0, 1)
           insert2(p1, p2, 2, 1)
           insert2(p1, p2, 0, 2)
           insert2(p1, p2, 1, 1)
           insert2(p1, p2, 2, 0)
           insert2(p1, p2, 1, 2)
           insert2(p1, p2, 1, 0)
           check[p1] = true
           check[p2] = true
       } else {
           insert1 := func(p, c int) {
               v[p] = c
               row := make([]int, m)
               copy(row, v)
               a = append(a, row)
           }
           insert1(p1, 2)
           insert1(p1, 1)
           check[p1] = true
       }
       for i := 0; i < m; i++ {
           if check[i] {
               continue
           }
           if len(a)%2 == 1 {
               f2(&a, i)
           } else {
               f3(&a, i)
           }
       }
   } else {
       insert1 := func(p, c int) {
           v[p] = c
           row := make([]int, m)
           copy(row, v)
           a = append(a, row)
       }
       if cnt[3] > 0 {
           p := 0
           for i := 0; i < m; i++ {
               if b[i] == 3 {
                   p = i
               }
           }
           insert1(p, 3)
           insert1(p, 1)
           insert1(p, 2)
           check[p] = true
       } else {
           insert1(0, 1)
           check[0] = true
       }
       for i := 0; i < m; i++ {
           if !check[i] {
               f1(&a, i)
           }
       }
   }
   for _, row := range a {
       mx := 0
       for _, x := range row {
           if x > mx {
               mx = x
           }
       }
       if mx > 0 {
           for j, x := range row {
               if j > 0 {
                   out.WriteByte(' ')
               }
               fmt.Fprint(out, x)
           }
           out.WriteByte('\n')
       }
   }
}
 
func f1(a *[][]int, x int) {
   old := *a
   n := len(old)
   for i := 0; i < n; i++ {
       row := make([]int, len(old[i]))
       copy(row, old[i])
       *a = append(*a, row)
   }
   for i := 0; i < n; i += 2 {
       (*a)[i+1][x] = 1
       (*a)[i+n][x] = 1
   }
   (*a)[n/2], (*a)[n] = (*a)[n], (*a)[n/2]
}
 
func f2(a *[][]int, x int) {
   old := *a
   n := len(old)
   for i := 0; i < n; i++ {
       row := make([]int, len(old[i]))
       copy(row, old[i])
       *a = append(*a, row)
   }
   for i := 1; i < n; i += 2 {
       (*a)[i+1][x] = 1
       (*a)[i+n][x] = 1
   }
   (*a)[n][x] = 1
}
 
func f3(a *[][]int, x int) {
   old := *a
   n := len(old)
   for i := 0; i < n; i++ {
       row := make([]int, len(old[i]))
       copy(row, old[i])
       *a = append(*a, row)
   }
   for i := 0; i < n; i += 2 {
       (*a)[i+1][x] = 1
       (*a)[i+n][x] = 1
   }
   // swap a[n] and a[2*n-1]
   (*a)[n], (*a)[2*n-1] = (*a)[2*n-1], (*a)[n]
}