#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long INF64 = 3e18 + 1;
const char invdir[]{'L', 'U', 'R', 'D'};
const char dir[]{'R', 'D', 'L', 'U'};
const int dx[]{0, 1, 0, -1};
const int dy[]{1, 0, -1, 0};
unsigned get_seed() {
  unsigned seed = chrono::system_clock::now().time_since_epoch().count();
  return seed;
}
const int MOD = 1000000007;
const int NMAX = 300003;
vector<pair<int, int>> G[100555];
bool viz[100555];
int sum[100555];
int sgn[100555];
bool fixx = 0;
long double uniquex = 0;
bool possible = 1;
long double ans[100555];
vector<int> vals;
vector<int> indices;
void dfs(int v, int p, int add, int sign) {
  viz[v] = 1;
  sum[v] = add;
  sgn[v] = sign;
  indices.push_back(v);
  if (sign == -1) {
    vals.push_back(add);
  } else {
    vals.push_back(-add);
  }
  for (auto el : G[v]) {
    if (el.first == p) continue;
    if (viz[el.first]) {
      int add2 = el.second - add;
      int sign2 = -sign;
      if (sign2 != sgn[el.first]) {
        long double xstar = 0;
        if (sign2 == 1) {
          xstar = 1.0L * (sum[el.first] - add2) / 2;
        } else {
          xstar = 1.0L * (add2 - sum[el.first]) / 2;
        }
        if (fixx) {
          if (xstar != uniquex) {
            possible = 0;
          }
        } else {
          fixx = 1;
          uniquex = xstar;
        }
      } else {
        if (add2 != sum[el.first])
          possible = 0;
        else {
        }
      }
    } else {
      dfs(el.first, v, el.second - add, -sign);
    }
  }
}
int solve() {
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    G[a].push_back({b, c});
    G[b].push_back({a, c});
  }
  long long sumrs = 0;
  for (int i = 1; i <= n; ++i) {
    if (!viz[i]) {
      fixx = 0;
      dfs(i, 0, 0, 1);
      sort(vals.begin(), vals.end());
      long double minx = vals[(vals.size() + 1) / 2 - 1];
      if (fixx) minx = uniquex;
      for (auto i : indices) {
        if (sgn[i] == -1)
          ans[i] = 1.0L * sum[i] - minx;
        else
          ans[i] = 1.0L * sum[i] + minx;
      }
      vals.clear();
      indices.clear();
    }
  }
  if (!possible) {
    cout << "NO\n";
  } else {
    cout << "YES\n";
    for (int i = 1; i <= n; ++i) {
      cout << ans[i] << " ";
    }
    cout << "\n";
  }
  return 0;
}
int main() {
  cin.tie(0);
  std::ios_base::sync_with_stdio(0);
  int T = 1;
  int i = 1;
  while (T--) {
    solve();
    i++;
  }
  return 0;
}
