```go
package main
import (
"bytes"
"io"
"os"
)
const INF int = 1 << 60
type FastScanner struct {
data []byte
idx int
}
func (fs *FastScanner) nextInt() int {
n := len(fs.data)
for fs.idx < n && fs.data[fs.idx] <= ' ' {
fs.idx++
}
sign := 1
if fs.data[fs.idx] == '-' {
sign = -1
fs.idx++
}
val := 0
for fs.idx < n {
c := fs.data[fs.idx]
if c <= ' ' {
break
}
val = val*10 + int(c-'0')
fs.idx++
}
return val * sign
}
func main() {
data, _ := io.ReadAll(os.Stdin)
fs := FastScanner{data: data}
n := fs.nextInt()
m := fs.nextInt()
nn := n * n
dist := make([]int, nn)
dir := make([]int, nn)
for i := 0; i < nn; i++ {
dist[i] = INF
dir[i] = INF
}
for i := 0; i < n; i++ {
dist[i*n+i] = 0
dir[i*n+i] = 0
}
for i := 0; i < m; i++ {
x := fs.nextInt() - 1
y := fs.nextInt() - 1
z := fs.nextInt()
idx := y*n + x
if z < dir[idx] {
dir[idx] = z
}
if z < dist[idx] {
dist[idx] = z
}
}
for k := 0; k < n; k++ {
krow := dist[k*n : (k+1)*n]
for i := 0; i < n; i++ {
irow := dist[i*n : (i+1)*n]
ik := irow[k]
if ik >= INF {
continue
}
for j := 0; j < n; j++ {
nv := ik + krow[j]
if nv < irow[j] {
irow[j] = nv
}
}
}
}
for i := 0; i < nn; i++ {
if dist[i] >= dir[i] {
dist[i] = INF
}
}
q := fs.nextInt()
a := make([]int, n)
b := make([]int, n)
c := make([]int, n)
ans := make([]byte, n)
var out bytes.Buffer
out.Grow(q * (n + 1))
for ; q > 0; q-- {
k := fs.nextInt()
for i := 0; i < n; i++ {
a[i] = fs.nextInt()
b[i] = INF
c[i] = INF
}
for s := 0; s < n; s++ {
as := a[s]
qrow := dir[s*n : (s+1)*n]
drow := dist[s*n : (s+1)*n]
for v := 0; v < n; v++ {
v1 := as + qrow[v]
if v1 < b[v] {
b[v] = v1
}
v2 := as + drow[v]
if v2 < c[v] {
c[v] = v2
}
}
}
for i := 0; i < n; i++ {
if c[i] < b[i]+k {
ans[i] = '1'
} else {
ans[i] = '0'
}
}
out.Write(ans)
out.WriteByte('\n')
}
os.Stdout.Write(out.Bytes())
}
```