← Home
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	if _, err := fmt.Fscan(reader, &n, &m); err != nil {
		return
	}

	adj := make([][]int, n+1)
	dist := make([][]int, n+1)
	for i := 1; i <= n; i++ {
		dist[i] = make([]int, n+1)
		for j := 1; j <= n; j++ {
			if i == j {
				dist[i][j] = 0
			} else {
				dist[i][j] = 1e9
			}
		}
	}

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

		dist[u][v] = 1
		if b == 1 {
			dist[v][u] = -1
		} else {
			dist[v][u] = 1
		}
	}

	color := make([]int, n+1)
	for i := 1; i <= n; i++ {
		if color[i] == 0 {
			color[i] = 1
			q := []int{i}
			for len(q) > 0 {
				curr := q[0]
				q = q[1:]
				for _, neighbor := range adj[curr] {
					if color[neighbor] == 0 {
						color[neighbor] = 3 - color[curr]
						q = append(q, neighbor)
					} else if color[neighbor] == color[curr] {
						fmt.Println("NO")
						return
					}
				}
			}
		}
	}

	for k := 1; k <= n; k++ {
		for i := 1; i <= n; i++ {
			if dist[i][k] != 1e9 {
				for j := 1; j <= n; j++ {
					if dist[k][j] != 1e9 {
						if dist[i][k]+dist[k][j] < dist[i][j] {
							dist[i][j] = dist[i][k] + dist[k][j]
						}
					}
				}
			}
		}
	}

	for i := 1; i <= n; i++ {
		if dist[i][i] < 0 {
			fmt.Println("NO")
			return
		}
	}

	maxD := -1
	bestU := -1
	for i := 1; i <= n; i++ {
		for j := 1; j <= n; j++ {
			if dist[i][j] > maxD {
				maxD = dist[i][j]
				bestU = i
			}
		}
	}

	fmt.Println("YES")
	fmt.Println(maxD)
	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Print(" ")
		}
		fmt.Print(dist[bestU][i])
	}
	fmt.Println()
}