#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e18;
const long double eps = 1e-6;
struct eq {
  long double m, c;
  eq() {}
  eq(long double a, long double b) : m(a), c(b) {}
  eq& operator+=(const eq& rhs) {
    m += rhs.m, c += rhs.c;
    return *this;
  }
  eq& operator-=(const eq& rhs) {
    m -= rhs.m, c -= rhs.c;
    return *this;
  }
  friend eq operator+(eq a, const eq& b) { return a += b; }
  friend eq operator-(eq a, const eq& b) { return a -= b; }
};
long double solv(eq a, eq b) {
  if (abs(a.m - b.m) < eps) {
    if (abs(a.c - b.c) > eps)
      return -(long double)inf;
    else
      return (long double)inf;
  }
  return (long double)(b.c - a.c) / (long double)(a.m - b.m);
}
long double f(eq a, long double x) {
  return (long double)a.m * x + (long double)a.c;
}
int n, m;
eq nod[100005];
long double x;
vector<pair<int, int> > adj[100005];
bitset<100005> vis;
vector<int> cc;
long double ans[100005];
bool x_found = false, fail_condition = false;
void dfs(int nw, int bf, eq cr) {
  if (fail_condition) return;
  if (vis[nw]) {
    long double get = solv(nod[nw], cr);
    if (abs(get) < eps) get = 0.0;
    if (abs(get + inf) < eps)
      fail_condition = true;
    else if (abs(get - (long double)inf) > eps) {
      if (x_found && abs(x - get) > eps)
        fail_condition = true;
      else {
        x = get;
        x_found = true;
      }
    }
    return;
  }
  cc.push_back(nw);
  nod[nw] = cr;
  vis[nw] = 1;
  for (pair<int, int> nx : adj[nw])
    if (nx.first != bf) {
      eq nex(0, nx.second);
      nex -= nod[nw];
      dfs(nx.first, nw, nex);
    }
  return;
}
unordered_map<long long, int> viss;
long long hash_(int a, int b) { return a * 200005ll + b; }
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << fixed << setprecision(10);
  cin >> n >> m;
  for (int u, v, w, i = 0; i < m; i++) {
    cin >> u >> v >> w;
    if (viss[hash_(u, v)]) {
      if (viss[hash_(u, v)] == w) continue;
      cout << "NO\n";
      return 0;
    }
    viss[hash_(u, v)] = viss[hash_(v, u)] = w;
    adj[u].push_back({v, w});
    if (u != v) adj[v].push_back({u, w});
  }
  vis = 0;
  for (int i = 1; i <= n; i++)
    if (!vis[i]) {
      cc.clear();
      x_found = false;
      dfs(i, i, eq(1, 0));
      if (fail_condition) break;
      if (!x_found) {
        bool flag = false;
        for (int j : cc) {
          if (viss[hash_(j, j)]) {
            x = solv(nod[j], eq(0, (long double)viss[hash_(j, j)] / 2.0));
            flag = true;
            break;
          }
        }
        if (!flag) {
          vector<long double> values;
          for (int j : cc) values.push_back(solv(nod[j], eq(0, 0)));
          sort(values.begin(), values.end());
          if (values.size() % 2 == 0)
            x = values[values.size() / 2] + values[values.size() / 2 - 1];
          else
            x = values[values.size() / 2] + values[values.size() / 2];
          x /= (long double)2.0;
        }
      }
      for (int j : cc) ans[j] = f(nod[j], x);
    }
  for (int i = 1; i <= n; i++) {
    for (pair<int, int> j : adj[i]) {
      if (abs((long double)ans[i] + (long double)ans[j.first] -
              (long double)j.second) > eps) {
        printf("NO\n");
        return 0;
      }
    }
  }
  if (fail_condition)
    cout << "NO\n";
  else {
    cout << "YES\n";
    for (int i = 1; i <= n; i++) cout << ans[i] << " ";
  }
  return 0;
}
