package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
scanner.Split(bufio.ScanWords)
scanner.Buffer(make([]byte, 1024*1024), 10*1024*1024)
if !scanner.Scan() {
return
}
b := scanner.Bytes()
n := 0
for _, c := range b {
n = n*10 + int(c-'0')
}
scanner.Scan()
b = scanner.Bytes()
m := 0
for _, c := range b {
m = m*10 + int(c-'0')
}
nextInt := func() int {
scanner.Scan()
b := scanner.Bytes()
res := 0
sign := 1
for i, c := range b {
if i == 0 && c == '-' {
sign = -1
} else {
res = res*10 + int(c-'0')
}
}
return res * sign
}
pos := make([][]int, m+1)
neg := make([][]int, m+1)
for i := 1; i <= n; i++ {
k := nextInt()
for j := 0; j < k; j++ {
v := nextInt()
if v > 0 {
pos[v] = append(pos[v], i)
} else {
neg[-v] = append(neg[-v], i)
}
}
}
satisfied := make([]bool, n+1)
ans := make([]int, m+1)
for i := 1; i <= m; i++ {
ans[i] = -1
}
adj := make([][]int, n+1)
deg := make([]int, n+1)
for i := 1; i <= m; i++ {
lp := len(pos[i])
ln := len(neg[i])
if lp > 0 && ln == 0 {
ans[i] = 1
for _, c := range pos[i] {
satisfied[c] = true
}
} else if lp == 0 && ln > 0 {
ans[i] = 0
for _, c := range neg[i] {
satisfied[c] = true
}
} else if lp == 1 && ln == 1 {
u := pos[i][0]
w := neg[i][0]
adj[u] = append(adj[u], i)
adj[w] = append(adj[w], i)
deg[u]++
deg[w]++
}
}
q := make([]int, 0, n)
for i := 1; i <= n; i++ {
if !satisfied[i] && deg[i] <= 1 {
q = append(q, i)
}
}
head := 0
ptr := 1
for {
if head < len(q) {
u := q[head]
head++
if satisfied[u] {
continue
}
if deg[u] == 0 {
fmt.Println("NO")
return
}
edgeVar := -1
for _, v := range adj[u] {
if ans[v] == -1 {
edgeVar = v
break
}
}
if pos[edgeVar][0] == u {
ans[edgeVar] = 1
} else {
ans[edgeVar] = 0
}
satisfied[u] = true
w := pos[edgeVar][0]
if w == u {
w = neg[edgeVar][0]
}
deg[w]--
if !satisfied[w] && deg[w] <= 1 {
q = append(q, w)
}
} else {
for ptr <= n && satisfied[ptr] {
ptr++
}
if ptr > n {
break
}
u := ptr
edgeVar := -1
for _, v := range adj[u] {
if ans[v] == -1 {
edgeVar = v
break
}
}
if pos[edgeVar][0] == u {
ans[edgeVar] = 1
} else {
ans[edgeVar] = 0
}
satisfied[u] = true
w := pos[edgeVar][0]
if w == u {
w = neg[edgeVar][0]
}
deg[w]--
if !satisfied[w] && deg[w] <= 1 {
q = append(q, w)
}
}
}
fmt.Println("YES")
out := make([]byte, m)
for i := 1; i <= m; i++ {
if ans[i] == -1 {
out[i-1] = '0'
} else {
out[i-1] = byte('0' + ans[i])
}
}
fmt.Println(string(out))
}