#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
#include <deque>
#include <assert.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <stdio.h>
#include <string.h>
#include <utility>
#include <math.h>
#include <bitset>
#include <iomanip>
#include <complex>
using namespace std;
//#define int long long
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef long double ld;
typedef long long ll;
#define X first
#define Y second
#define all(o) o.begin(), o.end()
#define endl '\n'
#define IOS ios::sync_with_stdio(0), cin.tie(0)

int gcd(int x,int y){ return (!y ? x : gcd(y, x%y)); }
const int maxn = 210, M = 3000;
int d[maxn][maxn];
void add_e(int u,int v,int w){
	d[u][v] = w;
}
int from[M], to[M], sg[M], val[maxn];
int32_t main(){
	IOS;
	int n, m;
	cin >> n >> m;
	memset(d, 63, sizeof d);
	for(int i=0; i<n; i++)
		d[i][i] = 0;
	for(int i=0; i<m; i++){
		cin >> from[i] >> to[i] >> sg[i];
		from[i]--, to[i]--;
		if(sg[i] == 1){
			add_e(from[i], to[i], 1);
			add_e(to[i], from[i], -1);
		}
		else{
			add_e(from[i], to[i], 1);
			add_e(to[i], from[i], 1);
		}
	}
	for(int k=0; k<n; k++)// gush i'm stupid. can't code floyd now
		for(int i=0; i<n; i++)
			for(int j=0; j<n; j++)
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
	for(int k=0; k<n; k++)
		for(int i=0; i<n; i++)
			for(int j=0; j<n; j++)
				if(d[i][k] + d[k][j] < d[i][j]){
					cout << "NO" << endl;
					return 0;
				}
	int mx = -1, st;
	for(int i=0; i<n; i++){
		for(int j=0; j<n; j++)
			if(d[i][j] > mx){
				st = i;
				mx = d[i][j];
			}
	}
	for(int i=0; i<n; i++)
		val[i] = d[st][i];
	for(int i=0; i<m; i++){
		int u = from[i], v = to[i], b = sg[i];
		if(b == 1 && val[v] != val[u] + 1){
			cout << "NO" << endl;
			return 0;
		}
		if(b == 0 && abs(val[v] - val[u]) != 1){
			cout << "NO" << endl;
			return 0;
		}
	}
	cout << "YES" << endl;
	cout << mx << endl;
	for(int i=0; i<n; i++)
		cout << val[i] << " ";
	cout << endl;
}
