#include <bits/stdc++.h>
using namespace std;
ifstream fin("AAtest.in.txt");
int n, m, a, b, c;
double cc = 1e9, su = 1000000, vahe = 0;
struct item {
  bool kyl = 0, pa = 0;
  double d = cc;
  vector<int> na, v;
} p[100005];
bool proov(double f, vector<int> &v, vector<double> &vd) {
  p[v[0]].d = f;
  for (int i : v) {
    double d = p[i].d;
    if (!p[i].pa)
      vd.emplace_back(d);
    else
      vd.emplace_back(-d);
    for (int(j) = (0); ((j)) < ((p[i].na.size())); ((j))++) {
      int k = p[i].na[j];
      if (p[k].pa != p[i].pa) {
        if (p[k].d == cc)
          p[k].d = p[i].v[j] - d;
        else if (p[k].d != p[i].v[j] - d) {
          vahe = cc;
          return 0;
        }
      } else if (p[k].d != p[i].v[j] - d) {
        vahe = (p[k].d - p[i].v[j] + d) / 2;
        if (!p[i].pa) vahe *= -1;
        return 0;
      }
    }
  }
  return 1;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cerr.tie(0);
  cin >> n >> m;
  for (int(i) = (0); ((i)) < ((m)); ((i))++) {
    cin >> a >> b >> c;
    p[a].na.emplace_back(b), p[a].v.emplace_back(c), p[b].na.emplace_back(a),
        p[b].v.emplace_back(c);
  }
  for (int i = 1; i <= n; i++)
    if (!p[i].kyl) {
      p[i].kyl = 1;
      vector<int> v = {i};
      int in = 0;
      while (v.size() > in) {
        int j = v[in];
        for (int(k) = (0); ((k)) < ((p[j].na.size())); ((k))++) {
          int f = p[j].na[k];
          if (!p[f].kyl) {
            p[f].kyl = 1;
            p[f].pa = p[j].pa ^ 1;
            v.emplace_back(f);
          }
        }
        in++;
      }
      vector<double> vd;
      bool kind = 0;
      if (!proov(0, v, vd)) {
        for (int i : v) p[i].d = cc;
        if (vahe == cc or !proov(vahe, v, vd)) {
          cout << "NO";
          return 0;
        }
        kind = 1;
      }
      if (!kind) {
        sort(vd.begin(), vd.end());
        for (int i : v) p[i].d = cc;
        proov(-vd[vd.size() / 2], v, vd);
      }
    }
  cout << "YES" << endl;
  for (int i = 1; i <= n; i++)
    cout << setprecision(6) << fixed << p[i].d << " ";
}
