// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2")
 
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <algorithm>
#include <cassert>
#include <unordered_set>
#include <unordered_map>
#include <set>
#include <map>
#include <queue>
#include <random>
#include <numeric>
#include <time.h>
#include <stack>
#include <bitset>

#define prev asasddlsa
#define rank aljds

#define rep(i, l, r) for (int i = l; i < r; i++)
#define repb(i, r, l) for (int i = r; i >= l; i++)
 
using namespace std;
 
typedef long long ll;
typedef double dbl;
 
template<typename T>
void print(const vector<T>& s){
    for (auto x : s)
        cout << x << " ";
    cout << endl;
}
 
template<class T>   
void print(const T* s, int n){
    for (int i = 0; i < n; i++)
        cout << s[i] << ' ';
    cout << endl;
}

template<class T>
void print(vector<vector<T>> s){
    for (int i = 0; i < s.size(); i++)
        print(s[i]);
}

const int maxn = 2e5 + 7;

vector<pair<int, int>> s[maxn];
int color[maxn], h[maxn];

void dfs(int v){
    color[v] = 1;
    for (auto[u, w] : s[v]){
        if (!color[u]){
            h[u] = h[v] + 1;
            dfs(u);
        }
    }
}

int dist[maxn], distt[maxn];

void floyd(int st, int n, int k = 0){
    if (k == 0) {
        fill(dist, dist + n, 10 * n);
        dist[st] = 0;
    }
    for (int i = 0; i < n; i++){
        for (int v = 0; v < n; v++){
            for (auto[u, w] : s[v]){
                w = w == 0 ? 1 : w;
                if (dist[u] > dist[v] + w)
                    dist[u] = dist[v] + w;
            }
        }
    }
}


int solve(){
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++){
        int a, b, c;
        cin >> a >> b >> c;
        s[a - 1].push_back({b - 1, c});
        s[b - 1].push_back({a - 1, -c});
    }
    dfs(0);
    for (int v = 0; v < n; v++){
        for (auto[u, w] : s[v]){
            if (h[u] % 2 == h[v] % 2){
                cout << "NO\n";
                return 0;
            }
        }
    }
    floyd(0, n);
    copy(dist, dist + n, distt);
    floyd(0, n, 1);
    for (int i = 0; i < n; i++){
        if (dist[i] != distt[i]){
            cout << "NO\n";
            return 0;
        }
    }
    int mx = -n, stt;
    for (int st = 0; st < n; st++){
        floyd(st, n);
        for (int i = 0; i < n; i++){
            if (dist[i] > mx){
                mx = dist[i];
                stt = st;
            }
        }
    }
    floyd(stt, n);
    mx = 0;
    for (int i = 0; i < n; i++){
        mx = max(mx, dist[i]);
        assert(dist[i] >= 0);
    }
    cout << "YES\n";
    cout << mx << '\n';
    for (int i = 0; i < n; i++)
        cout << dist[i] << ' ';
    cout << '\n';
    return 0;
}

int main(){
    srand(time(NULL));
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.precision(10);
    cout << fixed; 
    int t = 1;
    // cin >> t;
    while (t--)
        solve();
    return 0;
}
