#include <bits/stdc++.h>
using namespace std;
const int N = 100000 + 7;
const long double SMALL = 1e-10;
const long double EPS = 1e-14;
const long double INF = (long double)1e9;
int n, m;
vector<pair<int, int>> g[N];
vector<int> nodes;
bool vis[N];
int par[N];
long long a[N];
long long b[N];
long double sol[N];
void dfs(int i) {
  nodes.push_back(i);
  vis[i] = 1;
  for (auto &it : g[i]) {
    int j = it.first;
    long long s = it.second;
    if (vis[j] == 0) {
      par[j] = i;
      a[j] = -a[i];
      b[j] = s - b[i];
      dfs(j);
    }
  }
}
struct T {
  int x;
  int y;
  long long s;
};
long double get(long double x, long double y,
                vector<pair<long long, long long>> sol) {
  long double sum = 0;
  for (auto &it : sol) {
    sum += fabs(x * it.first + it.second);
    sum -= fabs(y * it.first + it.second);
  }
  return sum;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y, z;
    cin >> x >> y >> z;
    g[x].push_back({y, z});
    g[y].push_back({x, z});
  }
  for (int i = 1; i <= n; i++) {
    if (vis[i] == 0) {
      nodes.clear();
      a[i] = 1;
      b[i] = 0;
      dfs(i);
      vector<T> edges;
      for (auto &x : nodes) {
        for (auto &it : g[x]) {
          edges.push_back({x, it.first, it.second});
        }
      }
      bool found = 0;
      for (auto &it : edges) {
        int x = it.x;
        int y = it.y;
        long long s = it.s;
        if (a[x] == -a[y] && b[x] + b[y] != s) {
          cout << "NO\n";
          return 0;
        }
      }
      for (auto &it : edges) {
        int x = it.x;
        int y = it.y;
        long long s = it.s;
        if (a[x] == a[y]) {
          found = 1;
          sol[i] =
              ((long double)(s - (b[x] + b[y]))) / ((long double)(a[x] + a[y]));
          continue;
        }
      }
      if (found == 0) {
        vector<pair<long long, long long>> coefs;
        for (auto &j : nodes) {
          coefs.push_back({a[j], b[j]});
        }
        long double lo = -INF, hi = INF;
        for (int it = 1; it <= 200; it++) {
          long double mid = (lo + hi) * 0.5;
          if (get(mid - SMALL, mid, coefs) > -EPS) {
            lo = mid;
          } else {
            hi = mid;
          }
        }
        sol[i] = lo;
      }
      for (auto &j : nodes) {
        sol[j] = sol[i] * a[j] + b[j];
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    for (auto &it : g[i]) {
      int j = it.first;
      if (fabs(sol[i] + sol[j] - it.second) > EPS) {
        cout << "NO\n";
        return 0;
      }
    }
  }
  cout << "YES\n";
  for (int i = 1; i <= n; i++) {
    cout << fixed << setprecision(6) << sol[i] << " ";
  }
  cout << "\n";
  return 0;
}
