package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
var n, m int
if _, err := fmt.Fscan(in, &n, &m); err != nil {
return
}
const INF = int64(1e18)
adj := make([][]int64, n+1)
dist := make([][]int64, n+1)
for i := 1; i <= n; i++ {
adj[i] = make([]int64, n+1)
dist[i] = make([]int64, n+1)
for j := 1; j <= n; j++ {
adj[i][j] = INF
dist[i][j] = INF
}
adj[i][i] = 0
dist[i][i] = 0
}
for i := 0; i < m; i++ {
var x, y int
var z int64
fmt.Fscan(in, &x, &y, &z)
if z < adj[y][x] {
adj[y][x] = z
dist[y][x] = z
}
}
for k := 1; k <= n; k++ {
for i := 1; i <= n; i++ {
for j := 1; j <= n; j++ {
if dist[i][k] != INF && dist[k][j] != INF {
if dist[i][k]+dist[k][j] < dist[i][j] {
dist[i][j] = dist[i][k] + dist[k][j]
}
}
}
}
}
var q int
if _, err := fmt.Fscan(in, &q); err != nil {
return
}
for qi := 0; qi < q; qi++ {
var k int64
fmt.Fscan(in, &k)
a := make([]int64, n+1)
for i := 1; i <= n; i++ {
fmt.Fscan(in, &a[i])
}
ans := make([]byte, n)
for x := 1; x <= n; x++ {
unstable := false
for y := 1; y <= n; y++ {
if y == x {
continue
}
if dist[y][x] < adj[y][x] {
valid := true
for v := 1; v <= n; v++ {
if v == y {
continue
}
if adj[v][x] != INF {
if a[y]-k+dist[y][x] >= a[v]+adj[v][x] {
valid = false
break
}
}
}
if valid {
unstable = true
break
}
}
}
if unstable {
ans[x-1] = '1'
} else {
ans[x-1] = '0'
}
}
fmt.Fprintln(out, string(ans))
}
}