← Home
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))
}