//if u want do it,do it.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define endl                        '\n'
#define debug(e)                    cerr << #e << ": " <<  e << endl;
#define fast_io;                 ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const ll MOD=1e9+7;//998244353;//1e9+9;
//ll tavmd(ll a,ll b){if(b==0){return 1;}if(b%2==0){ll x=tavmd(a,b/2);return(x*x)%MOD;}else{return(a%MOD*tavmd(a,b-1)%MOD)%MOD;}}
//void mkay(ll &a){if(a>=MOD){a-=MOD;}else if(a<0){a+=MOD;}}
const ll INF=3e18;
const ll MAXN=1e5+10;
//const ll LOG=23;
//class FastIO{public:inline FastIO & operator << (const int &a){ printf("%d" , a); return *this; }inline FastIO & operator << (const ll &a){ printf("%I64d" , a); return *this; }inline FastIO & operator << (const double &a){ printf("%.9f" , a); return *this; }inline FastIO & operator << (const long double &a){ printf("%.9lf" , a); return *this; }inline FastIO & operator << (const char * const&a){ printf("%s" , a); return *this; }inline FastIO & operator << (const string &a){ printf("%s" , a.c_str()); return *this; }inline FastIO & operator >> (int &a){ scanf("%d" , &a); return *this; }inline FastIO & operator >> (ll &a){ scanf("%I64d" , &a); return *this; }inline FastIO & operator >> (double &a){ scanf("%lf" , &a); return *this; }inline FastIO & operator >> (long double &a){ scanf("%lf" , &a); return *this; }inline FastIO & operator >> (char * const&a){ scanf("%s" , a); return *this; }}fio;
ll u[2020],v[2020],w[2020],d[202][202];
int main(){
      fast_io;
      ll n,m;
      cin>>n>>m;
      pair<ll,ll>tmp={-1,-1};
      for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                  if(i!=j)
                        d[i][j]=INF;
      for(int i=0;i<m;i++){
            cin>>u[i]>>v[i]>>w[i];
            d[u[i]][v[i]]=1;
            if(w[i]==0)
                  d[v[i]][u[i]]=1;
            else
                  d[v[i]][u[i]]=-1;
      }
      for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                  for(int k=1;k<=n;k++){
                        if(d[k][i]!=INF&&d[i][j]!=INF&&d[k][i]+d[i][j]<d[k][j]){
                              d[k][j]=d[k][i]+d[i][j];
                              if(d[k][j]<-1e9){
                                    cout<<"NO"<<endl;
                                    return 0;
                              }
                        }
                  }
      for(int i=1;i<=n;i++){
            if(d[i][i]<0){
                  cout<<"NO";
                  return 0;
            }
            for(int k=1;k<=n;k++){
                  tmp=max(tmp,{d[i][k],i});
            }
      }
      for(int i=1;i<m;i++){
            if(d[tmp.second][u[i]]==d[tmp.second][v[i]]){
                  cout<<"NO";
                  return 0;
            }
      }
      cout<<"YES"<<endl<<tmp.first<<endl;
      for(int i=1;i<=n;i++)
            cout<<d[tmp.second][i]<<" ";
return 0;
}

    	 			 	 			    				  	 	  	