#include <bits/stdc++.h>
using namespace std;
const long long maxn = 1e5 + 50;
struct node {
  long long k, b;
  node(long long k = 0, long long b = 0) : k(k), b(b) {}
  bool operator==(const node &a) const {
    return this->k == a.k && this->b == a.b;
  }
};
vector<pair<long long, long long> > r[maxn];
node c[maxn];
long long used[maxn];
vector<long long> ord;
vector<long double> rd;
void dfs(long long v) {
  used[v] = 1;
  ord.push_back(v);
  for (auto &u : r[v]) {
    node need = {-c[v].k, -c[v].b + u.second};
    if (!used[u.first]) {
      c[u.first] = need;
      dfs(u.first);
    } else {
      if (!(need == c[u.first])) {
        if (c[v].k + c[u.first].k == 0) {
          cout << "NO" << '\n';
          exit(0);
        }
        rd.push_back((long double)(u.second - c[v].b - c[u.first].b) /
                     (c[v].k + c[u.first].k));
      }
    }
  }
}
void solve() {
  long long n, m;
  cin >> n >> m;
  for (long long i = 0; i < m; ++i) {
    long long a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    r[a].push_back({b, c});
    r[b].push_back({a, c});
  }
  long double ans[n];
  for (long long i = 0; i < n; ++i) {
    if (!used[i]) {
      ord.clear();
      rd.clear();
      c[i] = {1, 0};
      dfs(i);
      node kek = {0, 0};
      for (auto &j : ord) {
        kek.k += c[j].k;
        kek.b += c[j].b;
      }
      long double l = -1e6, r = 1e6;
      auto get = [&](long double mid) {
        long double ans = 0;
        for (auto &i : ord) ans += abs(c[i].k * mid + c[i].b);
        return ans;
      };
      if (rd.size() == 0) {
        while (r - l > 1e-12) {
          long double mid1 = l + (r - l) / 3;
          long double mid2 = r - (r - l) / 3;
          if (get(mid1) < get(mid2)) {
            r = mid2;
          } else {
            l = mid1;
          }
        }
      } else {
        sort(rd.begin(), rd.end());
        long double raz = rd.back() - rd[0];
        if (raz >= 1e-12) {
          cout << "NO" << '\n';
          exit(0);
        }
        l = rd[0];
      }
      for (auto &j : ord) ans[j] = c[j].k * l + c[j].b;
    }
  }
  cout << "YES" << '\n';
  for (long long i = 0; i < n; ++i) {
    cout << fixed << setprecision(12) << ans[i] << ' ';
  }
  cout << '\n';
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.precision(10);
  long long t = 1;
  while (t--) solve();
  return 0;
}
