#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const double dif = 0.000001;
int n, m;
vector<pair<int, int> > edge[maxn];
vector<int> node[maxn];
vector<double> zero;
pair<int, int> val[maxn];
double res[maxn];
bool vis[maxn];
bool sol;
double x;
vector<int> cur;
bool dfs(int u) {
  vis[u] = true;
  cur.push_back(u);
  if (val[u].first != 0)
    zero.push_back(double(-val[u].second) / (double)val[u].first);
  for (int i = 0; i < ((int(edge[u].size()))); i++) {
    int v = edge[u][i].first;
    int a = val[u].first + val[v].first, b = val[u].second + val[v].second;
    if (vis[v]) {
      if (a == 0) {
        if (b != edge[u][i].second) return false;
      } else {
        if (sol == true &&
            abs((double)a * x + (double)b - (double)edge[u][i].second) >= dif)
          return false;
        else
          x = (double)(edge[u][i].second - b) / (double)a, sol = true;
      }
    } else {
      val[v] = make_pair(-val[u].first, edge[u][i].second - val[u].second);
      if (!dfs(v)) return false;
    }
  }
  return true;
}
void solve() {
  if (sol == false) {
    sort(zero.begin(), zero.end());
    zero.erase(unique(zero.begin(), zero.end()), zero.end());
    int aa = 0, bb = 0;
    for (int i = 0; i < ((int(cur.size()))); i++) {
      int tmp = cur[i];
      if (val[tmp].first > 0)
        aa += val[tmp].first, bb += val[tmp].second;
      else if (val[tmp].first < 0)
        aa -= val[tmp].first, bb -= val[tmp].second;
      else {
        bb += abs(val[tmp].second);
        break;
      }
      double z = (double)(-val[tmp].second) / (double)val[tmp].first;
      int pos = lower_bound(zero.begin(), zero.end(), z) - zero.begin();
      node[pos].push_back(tmp);
    }
    double sum = (double)aa * zero.back() + (double)bb;
    x = zero.back();
    for (int i = (int(zero.size())) - 1; i > 0; i--) {
      double l = zero[i - 1], r = zero[i];
      for (int j = 0; j < ((int(node[i].size()))); j++) {
        int tmp = node[i][j];
        if (val[tmp].first > 0)
          aa -= 2 * val[tmp].first, bb -= 2 * val[tmp].second;
        else if (val[tmp].first < 0)
          aa += 2 * val[tmp].first, bb += 2 * val[tmp].second;
      }
      if (aa <= 0) {
        if ((double)aa * r + (double)bb < sum)
          sum = (double)aa * r + (double)bb, x = r;
      } else if ((double)aa * l + (double)bb < sum)
        sum = (double)aa * l + (double)bb, x = l;
    }
  }
  for (int i = 0; i < ((int(cur.size()))); i++) {
    int tmp = cur[i];
    res[tmp] = (double)val[tmp].first * x + (double)val[tmp].second;
  }
  for (int i = 0; i < ((int(zero.size()))); i++) node[i].clear();
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < (m); i++) {
    int u, v, s;
    cin >> u >> v >> s;
    edge[u].push_back(make_pair(v, s));
    edge[v].push_back(make_pair(u, s));
  }
  memset(vis, 0, sizeof(vis));
  for (int i = 1; i < (n + 1); i++)
    if (!vis[i]) {
      sol = false;
      cur.clear();
      val[i] = make_pair(1, 0);
      zero.clear();
      if (!dfs(i)) {
        cout << "NO";
        return 0;
      } else
        solve();
    }
  cout << "YES\n";
  for (int i = 1; i < (n + 1); i++) cout << res[i] << " ";
  return 0;
}
