#include <bits/stdc++.h>
using namespace std;
const long long max_N = 100003;
const long long max_M = 200003;
vector<pair<long long, long long> > briaunos[max_N];
bool nepavyko_uzdavinys = false;
struct reiskinys {
  long long skaicius, a;
  long double a_reiksme;
  bool isreikstas;
  bool isvestas;
  long double a_reiksme_kai_reisinys_nulis;
  reiskinys() {
    isreikstas = false;
    isvestas = false;
    skaicius = 0;
    a = 0;
  }
  void tapk_pradiniu() {
    skaicius = 0;
    a = 1;
    isreikstas = true;
  }
  long double reiksme() {
    return (long double)a_reiksme * (long double)a + (long double)skaicius;
  }
  void kada_tampa_nuliu() {
    if ((a == 0) && (skaicius == 0))
      a_reiksme_kai_reisinys_nulis = 0;
    else if (a == 0)
      a_reiksme_kai_reisinys_nulis = 1000000000;
    else
      a_reiksme_kai_reisinys_nulis =
          ((long double)0 - (long double)skaicius) / (long double)a;
  }
  bool operator<(const reiskinys &kitas) const {
    return a_reiksme_kai_reisinys_nulis < kitas.a_reiksme_kai_reisinys_nulis;
  }
};
reiskinys virsuniu_reiksmes[max_N];
void isreisk(reiskinys &turimas, reiskinys &norimas, long long suma) {
  norimas.a = 0 - turimas.a;
  norimas.skaicius = suma - turimas.skaicius;
  norimas.isreikstas = true;
}
pair<bool, long double> rask_a_reiksme(reiskinys &pirmas, reiskinys &antras,
                                       long double suma) {
  long long skaicius = 0 - (suma - pirmas.skaicius - antras.skaicius);
  long long a = 0 - pirmas.a - antras.a;
  if ((a == 0) && (skaicius != 0)) {
    nepavyko_uzdavinys = true;
    return {false, 0};
  } else if (a == 0) {
    return {false, 0};
  } else {
    long double a_reiksme = (long double)skaicius / (long double)a;
    return {true, a_reiksme};
  }
}
bool tenkina(reiskinys &pirmas, reiskinys &antras, long double suma) {
  if (pirmas.reiksme() + antras.reiksme() == suma) return true;
  return false;
}
void ieskok_minimalaus_a(vector<long long> komponente) {
  for (long long i = 0; i < komponente.size(); i++) {
    virsuniu_reiksmes[komponente[i]].kada_tampa_nuliu();
  }
  sort(komponente.begin(), komponente.end(), [&](long long &i, long long &j) {
    return virsuniu_reiksmes[i] < virsuniu_reiksmes[j];
  });
  reiskinys neigiami;
  reiskinys teigiami;
  long double a_reiksme =
      virsuniu_reiksmes[komponente[0]].a_reiksme_kai_reisinys_nulis - 1;
  bool ar_teigiamas[komponente.size()];
  for (long long i = 0; i < komponente.size(); i++) {
    virsuniu_reiksmes[komponente[i]].a_reiksme = a_reiksme;
    if (virsuniu_reiksmes[komponente[i]].reiksme() > (long double)0) {
      ar_teigiamas[i] = true;
      teigiami.a += virsuniu_reiksmes[komponente[i]].a;
      teigiami.skaicius += virsuniu_reiksmes[komponente[i]].skaicius;
    } else {
      ar_teigiamas[i] = false;
      neigiami.a -= virsuniu_reiksmes[komponente[i]].a;
      neigiami.skaicius -= virsuniu_reiksmes[komponente[i]].skaicius;
    }
  }
  neigiami.a_reiksme = a_reiksme;
  teigiami.a_reiksme = a_reiksme;
  long double minimalus_ats = teigiami.reiksme() + neigiami.reiksme();
  long double minimali_a_reiksme = a_reiksme;
  for (long long i = 0; i < komponente.size(); i++) {
    long double a_reiksme =
        virsuniu_reiksmes[komponente[i]].a_reiksme_kai_reisinys_nulis;
    neigiami.a_reiksme = a_reiksme;
    teigiami.a_reiksme = a_reiksme;
    if (ar_teigiamas[i]) {
      teigiami.a -= virsuniu_reiksmes[komponente[i]].a;
      teigiami.skaicius -= virsuniu_reiksmes[komponente[i]].skaicius;
      neigiami.a -= virsuniu_reiksmes[komponente[i]].a;
      neigiami.skaicius -= virsuniu_reiksmes[komponente[i]].skaicius;
    } else {
      neigiami.a += virsuniu_reiksmes[komponente[i]].a;
      neigiami.skaicius += virsuniu_reiksmes[komponente[i]].skaicius;
      teigiami.a += virsuniu_reiksmes[komponente[i]].a;
      teigiami.skaicius += virsuniu_reiksmes[komponente[i]].skaicius;
    }
    if (teigiami.reiksme() + neigiami.reiksme() < minimalus_ats) {
      minimalus_ats = teigiami.reiksme() + neigiami.reiksme();
      minimali_a_reiksme = a_reiksme;
    }
  }
  for (long long i = 0; i < komponente.size(); i++)
    virsuniu_reiksmes[komponente[i]].a_reiksme = minimali_a_reiksme;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  long long N, M;
  cin >> N >> M;
  for (long long i = 0; i < M; i++) {
    long long a, b, tipas;
    cin >> a >> b >> tipas;
    briaunos[a].push_back({b, tipas});
    briaunos[b].push_back({a, tipas});
  }
  bool surastas[N + 1];
  for (long long i = 1; i <= N; i++) surastas[i] = false;
  for (long long i = 1; i <= N; i++) {
    if (surastas[i]) continue;
    queue<long long> eile;
    vector<long long> komponente;
    eile.push(i);
    komponente.push_back(i);
    surastas[i] = true;
    virsuniu_reiksmes[i].tapk_pradiniu();
    while (!eile.empty()) {
      long long g = eile.front();
      eile.pop();
      for (long long j = 0; j < briaunos[g].size(); j++) {
        long long kitas = briaunos[g][j].first;
        if (surastas[kitas]) continue;
        if (g == kitas) continue;
        isreisk(virsuniu_reiksmes[g], virsuniu_reiksmes[kitas],
                briaunos[g][j].second);
        surastas[kitas] = true;
        eile.push(kitas);
        komponente.push_back(kitas);
      }
    }
    bool radau_a_reiksme = false;
    long double a_reiksme;
    for (long long j = 0; j < komponente.size(); j++) {
      long long dab = komponente[j];
      for (long long x = 0; x < briaunos[dab].size(); x++) {
        long long kitas = briaunos[dab][x].first;
        pair<bool, long double> ats =
            rask_a_reiksme(virsuniu_reiksmes[dab], virsuniu_reiksmes[kitas],
                           briaunos[dab][x].second);
        radau_a_reiksme = ats.first;
        a_reiksme = ats.second;
        if (radau_a_reiksme) {
          break;
        }
      }
      if (radau_a_reiksme) break;
    }
    if (radau_a_reiksme) {
      for (long long j = 0; j < komponente.size(); j++) {
        virsuniu_reiksmes[komponente[j]].a_reiksme = a_reiksme;
      }
      for (long long j = 0; j < komponente.size(); j++) {
        long long dab = komponente[j];
        for (long long x = 0; x < briaunos[dab].size(); x++) {
          long long kitas = briaunos[dab][x].first;
          if (!tenkina(virsuniu_reiksmes[dab], virsuniu_reiksmes[kitas],
                       briaunos[dab][x].second)) {
            nepavyko_uzdavinys = true;
          }
        }
      }
    } else {
      ieskok_minimalaus_a(komponente);
    }
  }
  if (nepavyko_uzdavinys)
    cout << "NO";
  else {
    cout << "YES\n";
    for (long long i = 1; i <= N; i++)
      cout << fixed << setprecision(9) << virsuniu_reiksmes[i].reiksme() << " ";
  }
  return 0;
}
