#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
const long long maxn = 3e5 + 1, mod = 998244353;
using namespace std;
struct num {
  long long a = 0, b = 1;
  num() {}
};
num operator-(long long x, num nm) {
  nm.b *= -1;
  nm.a = x - nm.a;
  return nm;
}
num v[maxn];
vector<pair<long long, long long> > g[maxn];
vector<long long> cv[maxn];
long long cn[maxn];
double ans[maxn];
long long cc = 0;
void dfs(long long x) {
  cn[x] = cc;
  cv[cc - 1].push_back(x);
  for (auto to : g[x]) {
    if (cn[to.first]) {
      continue;
    }
    v[to.first] = to.second - v[x];
    dfs(to.first);
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i < m; i++) {
    long long u, v, w;
    cin >> u >> v >> w;
    --u;
    --v;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  for (long long i = 0; i < n; i++) {
    if (cn[i]) continue;
    cn[i] = ++cc;
    dfs(i);
  }
  for (long long t = 0; t < cc; t++) {
    double cx = -14881488;
    for (auto x : cv[t]) {
      for (auto to : g[x]) {
        if (v[x].b == v[to.first].b) {
          cx = v[x].b * (to.second - (v[x].a + v[to.first].a)) / 2.;
          break;
        }
        if (v[x].a + v[to.first].a != to.second) {
          cout << "NO";
          return 0;
        }
      }
    }
    if (cx == -14881488) {
      vector<long long> nv;
      for (auto x : cv[t]) nv.push_back(-v[x].a * v[x].b);
      sort(nv.begin(), nv.end());
      long long sm = 0;
      for (long long i = 0; i < nv.size(); i++) sm += nv[i];
      long long nvs = nv.size();
      double mas = 1e17;
      long long mi = -1;
      for (long long i = 0; i < nv.size(); i++) {
        if (mas > sm + (2 * i - nvs) * nv[i]) {
          mas = sm + (2 * i - nvs) * nv[i];
          mi = i;
        }
        sm -= 2 * nv[i];
      }
      for (auto x : cv[t]) ans[x] = v[x].a + v[x].b * nv[mi];
      continue;
    }
    for (auto x : cv[t]) ans[x] = v[x].a + v[x].b * cx;
    for (auto x : cv[t])
      for (auto to : g[x])
        if (ans[x] + ans[to.first] != to.second) {
          cout << "NO";
          return 0;
        }
  }
  cout << "YES\n";
  for (long long i = 0; i < n; i++) cout << ans[i] << ' ';
  return 0;
}
