#include <bits/stdc++.h>
const int MAXN = 1e5 + 10;
const double inf = 10000000000000000.0;
using namespace std;
int N, M, mn, mask;
long long cte[MAXN], x_value[MAXN];
double real_val[MAXN];
vector<pair<int, int> > adj[MAXN];
bool vis[MAXN], marc[MAXN];
void impossible() {
  printf("NO\n");
  exit(0);
}
void dfs(int x) {
  marc[x] = vis[x] = true;
  for (auto e : adj[x]) {
    if (marc[e.first]) {
      double val = real_val[e.first] + real_val[x] - (double)(e.second);
      if (val < 0) val = -val;
      if (val > 0.000001) impossible();
      continue;
    }
    real_val[e.first] = (double)(e.second) - real_val[x];
    dfs(e.first);
  }
}
void bfs(int S) {
  vector<int> fila;
  int ini = 0;
  fila.push_back(S);
  vis[S] = true;
  while (ini < (int)fila.size()) {
    int x = fila[ini++];
    for (auto e : adj[x]) {
      if (vis[e.first]) {
        long long lado_esq = (double)(e.second) - cte[e.first] - cte[x];
        long long lado_dir = x_value[x] + x_value[e.first];
        if (lado_esq == 0 && lado_dir == 0) continue;
        if (lado_dir == 0 && lado_esq != 0) impossible();
        real_val[S] = ((double)(lado_esq)) / ((double)lado_dir);
        dfs(S);
        return;
      } else {
        vis[e.first] = true;
        fila.push_back(e.first);
        x_value[e.first] = -x_value[x];
        cte[e.first] = e.second - cte[x];
      }
    }
  }
  vector<pair<double, int> > v;
  double cnt = 0.0;
  double ctes = 0.0;
  for (int i = 0; i < (int)fila.size(); i++) {
    int e = fila[i];
    if (x_value[e] == 0) {
      ctes += cte[e];
      continue;
    }
    double num = (double)cte[e];
    double den = (double)x_value[e];
    v.push_back(make_pair(-num / den, e));
    if (den > 0) {
      cnt -= den;
      ctes -= num;
    } else {
      cnt += den;
      ctes += num;
    }
  }
  sort(v.begin(), v.end());
  double soma = (double)inf;
  for (auto e : v) {
    double x = e.first;
    int belong = e.second;
    double cur_soma = ctes + cnt * x;
    if (soma > cur_soma) soma = cur_soma, real_val[S] = x;
    double num = cte[belong];
    double den = x_value[belong];
    if (x_value[belong] > 0) {
      cnt += 2.0 * den;
      ctes += 2.0 * num;
    } else {
      cnt -= 2.0 * den;
      ctes -= 2.0 * num;
    }
  }
  dfs(S);
}
int main() {
  scanf("%d%d", &N, &M);
  for (int i = 1, u, v, w; i <= M; i++) {
    scanf("%d%d%d", &u, &v, &w);
    adj[u].push_back(make_pair(v, w));
    adj[v].push_back(make_pair(u, w));
  }
  for (int i = 1; i < N + 1; i++) {
    if (vis[i]) continue;
    x_value[i] = 1;
    bfs(i);
  }
  printf("YES\n");
  for (int i = 1; i < N + 1; i++) printf("%.10lf ", real_val[i]);
  printf("\n");
}
