← Home
 package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	writer := bufio.NewWriter(os.Stdout)
	defer writer.Flush()

	var n, m int
	fmt.Fscan(reader, &n, &m)

	edges := make([][2]int, m)
	adj := make([][]int, n+1)

	for i := 0; i < m; i++ {
		var u, v int
		fmt.Fscan(reader, &u, &v)
		edges[i] = [2]int{u, v}
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}

	color := make([]int, n+1)
	for i := 1; i <= n; i++ {
		color[i] = -1
	}

	queue := make([]int, 0, n)
	color[1] = 0
	queue = append(queue, 1)

	possible := true
	for head := 0; head < len(queue) && possible; head++ {
		u := queue[head]
		for _, v := range adj[u] {
			if color[v] == -1 {
				color[v] = 1 - color[u]
				queue = append(queue, v)
			} else if color[v] == color[u] {
				possible = false
				break
			}
		}
	}

	if !possible {
		fmt.Fprintln(writer, "NO")
		return
	}

	fmt.Fprintln(writer, "YES")

	var sb strings.Builder
	sb.Grow(m)

	for i := 0; i < m; i++ {
		u := edges[i][0]
		if color[u] == 0 {
			sb.WriteByte('0')
		} else {
			sb.WriteByte('1')
		}
	}

	fmt.Fprintln(writer, sb.String())
}