#include <bits/stdc++.h>
using namespace std;
const int MAXN = (int)1e5;
int n, m;
vector<pair<int, int> > ms[MAXN + 5];
bool bio[MAXN + 5], proso, postoji = 1;
pair<int, int> val[MAXN + 5];
long double cur, sol[MAXN + 5];
vector<pair<long double, bool> > res;
vector<int> tu[2 * MAXN + 5], akt;
void dfs(int first) {
  bio[first] = 1;
  for (vector<pair<int, int> >::iterator i = ms[first].begin();
       i != ms[first].end(); ++i) {
    pair<int, int> o = *i;
    if (bio[o.first]) {
      if (val[first].second != val[o.first].second) {
        if (val[first].first + val[o.first].first != o.second) {
          postoji = 0;
          return;
        }
      } else {
        long double sad =
            (long double)(o.second - val[first].first - val[o.first].first) /
            (long double)(2 * val[first].second);
        if (proso && cur != sad) {
          postoji = 0;
          return;
        }
        proso = 1;
        cur = sad;
      }
      continue;
    }
    val[o.first].first = o.second - val[first].first;
    val[o.first].second = -val[first].second;
    dfs(o.first);
  }
}
void dfs2(int first) {
  bio[first] = 1;
  akt.push_back(first);
  for (vector<pair<int, int> >::iterator i = ms[first].begin();
       i != ms[first].end(); ++i) {
    pair<int, int> o = *i;
    if (bio[o.first]) continue;
    dfs2(o.first);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int first, second, type;
    cin >> first >> second >> type;
    ms[first].push_back(make_pair(second, type));
    ms[second].push_back(make_pair(first, type));
  }
  for (int i = 1; i <= n; ++i) {
    if (bio[i]) continue;
    proso = 0;
    val[i] = make_pair(0, 1);
    dfs(i);
    if (!postoji) {
      cout << "NO" << endl;
      return 0;
    }
    if (proso) {
      res.push_back(make_pair(cur, 1));
    } else {
      res.push_back(make_pair(0, 0));
    }
  }
  memset(bio, 0, sizeof(bio));
  int idx = -1;
  for (int i = 1; i <= n; ++i) {
    if (bio[i]) continue;
    akt.clear();
    dfs2(i);
    idx++;
    if (res[idx].second) {
      for (int j = 0; j < (int)akt.size(); ++j) {
        int first = akt[j];
        long double sad = res[idx].first * (long double)val[first].second +
                          (long double)val[first].first;
        sol[first] = sad;
      }
      continue;
    }
    vector<int> v;
    long double br = 0, sum = 0;
    for (int j = 0; j < (int)akt.size(); ++j) {
      int first = akt[j];
      tu[-val[first].first * val[first].second + MAXN].push_back(first);
      br--;
      sum -= val[first].first * val[first].second;
      v.push_back(-val[first].first * val[first].second);
    }
    sort(v.begin(), v.end());
    v.resize(unique(v.begin(), v.end()) - v.begin());
    long double koji = v[0];
    long double mini = br * koji + sum;
    for (int j = 0; j < (int)v.size(); ++j) {
      for (int l = 0; l < (int)tu[v[j] + MAXN].size(); ++l) {
        int first = tu[v[j] + MAXN][l];
        sum += 2 * val[first].second * val[first].first;
        br += 2;
      }
      long double ovaj = br * v[j] + sum;
      if (ovaj < mini) {
        mini = ovaj;
        koji = v[j];
      }
    }
    for (int j = 0; j < (int)akt.size(); ++j) {
      int first = akt[j];
      long double sad =
          koji * (long double)val[first].second + (long double)val[first].first;
      tu[-val[first].first * val[first].second + MAXN].pop_back();
      sol[first] = sad;
    }
  }
  cout << "YES" << endl;
  for (int i = 1; i <= n; ++i) {
    cout << sol[i] << ' ';
  }
  cout << endl;
  return 0;
}
