#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 5;
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 (x.first == par) {
      if (val[x.first].second == b) {
        if (val[x.first].first == a) {
          continue;
        }
        cout << "NO" << endl;
        exit(0);
      } else {
        double setval = (double)((double)a - (double)val[x.first].first) /
                        ((double)val[x.first].second - (double)b);
        if (holdres != -1e9) {
          if (setval != holdres) {
            cout << "NO" << endl;
            exit(0);
          }
        }
        holdres = setval;
        continue;
      }
    } else {
      if (val[x.first].second == b) {
        if (val[x.first].first == a) {
          continue;
        }
        cout << "NO" << endl;
        exit(0);
      } else {
        double setval = (double)((double)a - (double)val[x.first].first) /
                        ((double)val[x.first].second - (double)b);
        if (holdres != -1e9) {
          if (setval != holdres) {
            cout << "NO" << endl;
            exit(0);
          }
        }
        holdres = setval;
        continue;
      }
    }
  }
}
void dfs2(int curr, int par, double hold) {
  visited2[curr] = true;
  res[curr] = (double)val[curr].first + (double)val[curr].second * (double)hold;
  for (auto x : v1[curr]) {
    if (!visited2[x.first]) {
      dfs2(x.first, curr, hold);
    }
  }
}
int main() {
  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 = -1e9;
      dfs(i, i);
      if (holdres != -1e9) {
        dfs2(i, i, holdres);
        cmp.clear();
        continue;
      }
      tmp.clear();
      for (int x : cmp) {
        tmp.push_back((double)-val[x].first / (double)val[x].second);
      }
      sort(tmp.begin(), tmp.end());
      double val2 = tmp[(int)tmp.size() / 2];
      if ((int)tmp.size() % 2 == 0 && (int)tmp.size() > 2) {
        val2 = (double)(tmp[(int)tmp.size() / 2] +
                        tmp[((int)tmp.size() / 2) - 1]) /
               2;
      }
      dfs2(i, i, val2);
      cmp.clear();
    }
  }
  cout << "YES" << endl;
  for (int i = 1; i <= n; i++) {
    cout << setprecision(10) << res[i] << " ";
  }
  cout << endl;
}
