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())
}