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
}