#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
const double eps = 1e-8;
pair<double, double> holdres;
bool blocked[MAXN];
pair<int, int> val[MAXN];
vector<double> tmp;
double res[MAXN];
vector<pair<int, int>> v1[MAXN];
vector<int> cmp;
bool visited[MAXN];
bool visited2[MAXN];
queue<int> q1;
void dfs(int curr, int par) {
  visited[curr] = true;
  cmp.push_back(curr);
  for (auto x : v1[curr]) {
    int a, b;
    if (x.second == 1) {
      a = 1 - val[curr].first;
    } else {
      a = 2 - val[curr].first;
    }
    b = -val[curr].second;
    if (!visited[x.first]) {
      val[x.first].first = a;
      val[x.first].second = b;
      dfs(x.first, curr);
    } else {
      if (val[x.first].second == b) {
        if (val[x.first].first == a) {
          continue;
        }
        cout << "NO" << endl;
        exit(0);
      } else {
        pair<double, double> setval =
            make_pair((double)((double)a - (double)val[x.first].first),
                      ((double)val[x.first].second - (double)b));
        if (holdres != make_pair(-1e9, -1e9)) {
          if ((double)(setval.first * holdres.second) !=
              (double)(setval.second * holdres.first)) {
            cout << "NO" << endl;
            exit(0);
          }
        }
        holdres = setval;
        continue;
      }
    }
  }
}
double f(double xx) {
  double res = 0;
  for (int x : cmp) {
    res += fabs(xx * (double)val[x].second + (double)val[x].first);
  }
  return res;
}
int main() {
  cout.setf(ios::fixed);
  cout.precision(7);
  int n, m;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int x, y, w;
    cin >> x >> y >> w;
    v1[x].push_back(make_pair(y, w));
    v1[y].push_back(make_pair(x, w));
  }
  for (int i = 1; i <= n; i++) {
    if (!visited[i]) {
      val[i].first = 0;
      val[i].second = 1;
      holdres = make_pair(-1e9, -1e9);
      cmp.clear();
      dfs(i, i);
      if (holdres != make_pair(-1e9, -1e9)) {
        double hold3 = (double)((double)holdres.first / (double)holdres.second);
        for (int x : cmp) {
          res[x] = (double)val[x].first + (double)val[x].second * (double)hold3;
        }
        cmp.clear();
        continue;
      }
      double l = -100000000, r = 100000000;
      while (fabs(r - l) > eps) {
        double m1 = l + (r - l) / (double)3;
        double m2 = r - (r - l) / (double)3;
        if (f(m1) > f(m2))
          l = m1;
        else
          r = m2;
      }
      for (int x : cmp) {
        res[x] = (double)val[x].first + (double)val[x].second * (double)l;
      }
      cmp.clear();
    }
  }
  cout << "YES" << endl;
  for (int i = 1; i <= n; i++) {
    cout << res[i] << " ";
  }
  cout << endl;
}
