← Home
package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	buf := make([]byte, 1024*1024)
	scanner.Buffer(buf, 10*1024*1024)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	t := parseUint(scanner.Bytes())

	for i := 0; i < t; i++ {
		scanner.Scan()
		n := parseUint(scanner.Bytes())
		scanner.Scan()
		k := parseUint(scanner.Bytes())

		scanner.Scan()
		s := append([]byte(nil), scanner.Bytes()...)

		count := make([]int, k)
		for j := 0; j < n; j++ {
			scanner.Scan()
			a := scanner.Bytes()
			for b := 0; b < k; b++ {
				if a[b] == '1' {
					count[k-1-b]++
				}
			}
		}

		valid := make([]bool, n+1)
		valid[0] = true

		prev_carry := make([]int32, (k+1)*(n+1))
		choice := make([]int8, (k+1)*(n+1))

		for b := 0; b < k; b++ {
			next_valid := make([]bool, n+1)
			s_bit := int(s[k-1-b] - '0')
			cnt := count[b]

			for c := 0; c <= n; c++ {
				if !valid[c] {
					continue
				}
				for x := 0; x <= 1; x++ {
					w := cnt
					if x == 1 {
						w = n - cnt
					}
					v := c + w
					if v%2 == s_bit {
						nc := v / 2
						next_valid[nc] = true
						idx := (b+1)*(n+1) + nc
						prev_carry[idx] = int32(c)
						choice[idx] = int8(x)
					}
				}
			}
			valid = next_valid
		}

		if valid[0] {
			ans := make([]byte, k)
			curr_c := 0
			for b := k; b >= 1; b-- {
				idx := b*(n+1) + curr_c
				x := choice[idx]
				ans[k-b] = byte('0' + x)
				curr_c = int(prev_carry[idx])
			}
			fmt.Println(string(ans))
		} else {
			fmt.Println("-1")
		}
	}
}

func parseUint(b []byte) int {
	res := 0
	for _, v := range b {
		res = res*10 + int(v-'0')
	}
	return res
}