#include <bits/stdc++.h>
const int N = 100020;
using namespace std;
long long ans[N];
vector<long long> edges;
vector<long long> vertices;
long long vis[N];
long long w[N];
void dfs(long long v, vector<vector<long long> > &gr, vector<long long> &a,
         vector<long long> &b, vector<long long> &c, long long here,
         long long rt) {
  vertices.push_back(v);
  vis[v] = rt;
  w[v] = here;
  for (auto i : gr[v]) {
    long long u = a[i] + b[i] - v;
    edges.push_back(i);
    if (vis[u] != rt) {
      dfs(u, gr, a, b, c, c[i] - here, rt);
    }
  }
}
void solve(long long v, vector<vector<long long> > &gr, vector<long long> &a,
           vector<long long> &b, vector<long long> &c, vector<long long> &col) {
  edges.clear();
  vertices.clear();
  long long X = 1000000000;
  dfs(v, gr, a, b, c, X, X);
  long long limits = 0, tt = 0;
  for (auto e : edges) {
    if (w[a[e]] + w[b[e]] == c[e]) continue;
    limits = 1;
    long long xs = 0, other = 0;
    if (w[a[e]] < 0) {
      xs--;
      other += w[a[e]] + X;
    } else {
      xs++;
      other += w[a[e]] - X;
    }
    if (w[b[e]] < 0) {
      xs--;
      other += w[b[e]] + X;
    } else {
      xs++;
      other += w[b[e]] - X;
    }
    if (xs == 0) {
      cout << "NO\n";
      exit(0);
    }
    tt = (c[e] - other) / xs;
  }
  if (limits == 0) {
    vector<long long> val;
    for (auto v : vertices) {
      if (w[v] > 0) {
        long long z = w[v] - X;
        val.push_back(-z);
      } else {
        long long z = w[v] + X;
        val.push_back(z);
      }
    }
    sort((val).begin(), (val).end());
    long long z = val[val.size() / 2];
    vertices.clear();
    edges.clear();
    dfs(v, gr, a, b, c, z, z);
    long long ok = 1;
    for (auto e : edges) {
      if (w[a[e]] + w[b[e]] != c[e]) {
        ok = 0;
      }
    }
    for (auto v : vertices) col[v] = 1;
    assert(ok);
  } else {
    vertices.clear();
    edges.clear();
    dfs(v, gr, a, b, c, tt, tt);
    long long ok = 1;
    for (auto e : edges) {
      if (w[a[e]] + w[b[e]] != c[e]) {
        ok = 0;
      }
    }
    for (auto v : vertices) col[v] = 1;
    if (!ok) {
      cout << "NO\n";
      exit(0);
    }
  }
}
signed main() {
  long long n, m;
  cin >> n >> m;
  vector<vector<long long> > graph(n);
  vector<long long> a(m), b(m), c(m);
  for (long long(i) = 0; (i) != (m); (i)++) {
    cin >> a[i] >> b[i] >> c[i];
    c[i] *= 2, a[i]--, b[i]--;
    graph[a[i]].push_back(i);
    graph[b[i]].push_back(i);
  }
  vector<long long> col(n);
  for (long long(i) = 0; (i) != (n); (i)++) {
    if (col[i] == 0) {
      solve(i, graph, a, b, c, col);
    }
  }
  printf("YES\n");
  for (long long(i) = 0; (i) != (n); (i)++) printf("%.9f ", w[i] / 2.0);
}
