#include <iostream>
#include<bits/stdc++.h>
#include <chrono> 
#include <algorithm> 
#define pi 3.14159265
// #include <typeinfo>
// #include<String>
using namespace std;
using namespace std::chrono;
typedef long long int ll;
typedef vector<int> vi; 
typedef vector<vi> vvi;
typedef vector<vvi> vvvi;
typedef vector<double> vd; 
typedef vector<vd> vvd;
typedef vector<vvd> vvvd;
typedef vector<bool> vb; 
typedef vector<vb> vvb;
typedef vector<char> vc;
typedef vector<vc> vvc;
typedef vector<string> vs;
typedef vector<vs> vvs;
typedef vector<vvs> vvvs;
typedef vector<ll> vll; 
typedef vector<vll> vvll;
// typedef unordered_map ump;
// typedef unordered_map ump;
// #define unordered_map ump
// auto start = high_resolution_clock::now();
//     for(int i = 0;i<k;i++) s.lower_bound(i);
//     auto stop = high_resolution_clock::now(); 
//     auto duration = duration_cast<microseconds>(stop - start);
//     cout << "Time taken by function: "
//          << duration.count() << " microseconds" << endl; 
#define mod 1000000007
// #define unordered_map ump


struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};  
struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};


void show_vi(vector<int> t){
    // //cout<<"show_vi"<<endl;
    for(int i = 0;i<t.size();i++){
        cout<<t[i]<<",";
    }
    cout<<endl;
}

void show_vd(vector<double> t){
    // //cout<<"show_vi"<<endl;
    for(int i = 0;i<t.size();i++){
        cout<<t[i]<<",";
    }
    cout<<endl;
}
void show_vll(vector<ll> t){
    // //cout<<"show_vi"<<endl;
    for(int i = 0;i<t.size();i++){
        cout<<t[i]<<",";
    }
    cout<<endl;
}


void show_vt(vector<tuple<long long,long long>> t){
    // //cout<<"show_vi"<<endl;
    for(int i = 0;i<t.size();i++){
        cout<<get<0>(t[i])<<" "<<get<1>(t[i])<<"::";
    }
    cout<<endl;
}

void show_vb(vector<bool> t){
    // //cout<<"show_vi"<<endl;
    for(int i = 0;i<t.size();i++){
        cout<<t[i]<<" ";
    }
    cout<<endl;
}

void show_vvi(vector<vector<int>> ans){
    cout<<"---------------------------"<<endl;
    for(int i = 0;i<ans.size();i++){
        show_vi(ans[i]);
    }
    cout<<endl;
}


void show_vvvi(vvvi ans){
    for(int i = 0;i<ans.size();i++){
    cout<<"****************************************************"<<endl;
        show_vvi(ans[i]);
    }
    cout<<endl;
}


void show_vvb(vector<vector<bool>> ans){
    cout<<"---------------------------"<<endl;
    for(int i = 0;i<ans.size();i++){
        show_vb(ans[i]);
    }
    cout<<endl;
}

void show_vs(vector<string> A){
    for(int i =0;i<A.size();i++){
        cout<<A[i]<<"::";
    }
    cout<<endl;
}

void show_vc(vector<char> A){
    for(int i =0;i<A.size();i++){
        cout<<A[i];
    }
    cout<<endl;
}

void show_vvc(vector<vector<char>> A){
    cout<<"---------------------------"<<endl;
    for(int i =0;i<A.size();i++){
        show_vc(A[i]);
    }
}

void show_vvs(vector<vector<string>> A){
    for(int i = 0;i<A.size();i++){
        show_vs(A[i]);
    }
}

void show_um(unordered_map<int,int> map){
    unordered_map<int,int>::iterator it;
    it = map.begin();
    int count = -6;
    while(count<7){
        it=map.find(count);
        cout<<it->second<<" ";
        count ++;
    }
    cout<<endl;
}



ll ncr(ll n, ll k)  
{  
    if (k == 0 || k == n)  
        return 1;  
    return (ncr(n - 1, k - 1) +  
                    ncr(n - 1, k));//%mod;  
} 



// int ncr(int n, int r) 
// { 
//     if (r > n - r) 
//         r = n - r; 
//     int C[r + 1]; 
//     memset(C, 0, sizeof(C)); 
  
//     C[0] = 1; 
//     for (int i = 1; i <= n; i++) { 
//         for (int j = min(i, r); j > 0; j--) 
//             C[j] = (C[j] + C[j - 1]) ; 
//     } 
//     return C[r]; 
// } 

int fact(int n){
    return (n==0)?1:n*fact(n-1);
}

int hcf(int a,int b){
    if(a%b==0) return b;
    return hcf(b,a%b);
}


vll prime_factors(ll n){
    vll ans;
    while (n % 2 == 0)  
    {  
        ans.push_back(2);
        n = n/2;  
    }  
   
    for (int i = 3; i <= sqrt(n); i = i + 2)  
    {   
        while (n % i == 0)  
        {  
            ans.push_back(i);  
            n = n/i;  
        }  
    }  
    if (n > 2)  
        ans.push_back(n);
    return ans;
}


void help(){
    int n,m;
    cin>>n>>m;
    int dist[n][n];
    int u[m],v[m];
    for(int i = 0;i<n;i++){
        for(int j = 0;j<n;j++){
            if(i==j) dist[i][j] = 0;
            else dist[i][j] = INT_MAX;
        }
    }
    for(int i = 0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        --a;--b;
        u[i] = a;v[i] = b;
        dist[a][b] = 1;
        dist[b][a] = c==1 ? -1 : 1;
    }

    for(int k = 0; k < n; k++) {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                if(dist[i][k] != INT_MAX && dist[k][j] != INT_MAX && dist[i][k] + dist[k][j] < dist[i][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                    if(dist[i][j] < -1e9) {
                        // integer underflow -> negative cycle
                        cout << "NO\n";
                        return ;
                    }
                }
            }
        }
    }

    pair<int,int> best = {-1,0};
    for(int i = 0;i<n;i++){
        if(dist[i][i]<0){
            cout<<"NO"<<endl;
            return;
        }
        for(int j = 0;j<n;j++){
            best = max(best,{dist[i][j],i});
        }
    }
    int s = best.second;
    for(int i = 0;i<m;i++){
        if(dist[s][v[i]]==dist[s][u[i]]){
            cout<<"NO"<<endl;
            return;
        }
    }
    cout<<"YES"<<endl<<best.first<<endl;
    for(int i = 0;i<n;i++){
        cout<<dist[best.second][i]<<" ";
    }
    cout<<endl;


}



int main() {   
    int t;
    // cin>>t;
    // while(t--){
    //     help();
    // }
    help();
    return 0;
}
