#include <bits/stdc++.h>
using namespace std;
vector<pair<long long, long long> > AdjList[100005];
long long posx[100005], negx[100005];
long long usepos[100005], useneg[100005], vis[100005];
long long val[100005];
long long N, M, A, B, C;
vector<long long> vert;
long long fixable = 0;
void dfs(long long x, long long p) {
  vis[x] = 1;
  vert.push_back(x);
  for (auto it : AdjList[x]) {
    if (it.first == p) continue;
    if (!vis[it.first]) {
      if (usepos[x]) {
        useneg[it.first] = 1;
        negx[it.first] = it.second - posx[x];
        assert(abs(negx[it.first]) <= 1e9);
      }
      if (useneg[x]) {
        usepos[it.first] = 1;
        posx[it.first] = it.second - negx[x];
        assert(abs(posx[it.first]) <= 1e9);
      }
      dfs(it.first, x);
    } else {
      if (usepos[x]) {
        if (!useneg[it.first]) {
          useneg[it.first] = 1;
          negx[it.first] = it.second - posx[x];
          assert(abs(negx[it.first]) <= 1e9);
        } else {
          if (negx[it.first] != it.second - posx[x]) fixable = 0;
        }
      }
      if (useneg[x]) {
        if (!usepos[it.first]) {
          usepos[it.first] = 1;
          posx[it.first] = it.second - negx[x];
          assert(abs(posx[it.first]) <= 1e9);
        } else {
          if (posx[it.first] != it.second - negx[x]) fixable = 0;
        }
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> N >> M;
  for (int i = 1; i <= M; ++i) {
    cin >> A >> B >> C;
    AdjList[A].push_back(pair<long long, long long>(B, C));
    AdjList[B].push_back(pair<long long, long long>(A, C));
  }
  for (int i = 1; i <= N; ++i) {
    if (!vis[i]) {
      vert.clear();
      fixable = 1;
      usepos[i] = 1;
      posx[i] = 0;
      dfs(i, -1);
      if (!fixable) {
        cout << "NO\n";
        return 0;
      }
      long long v = 0;
      int fx = 0;
      for (auto it : vert) {
        if (usepos[it] && useneg[it]) {
          if (fx == 1 && v != (negx[it] - posx[it])) {
            cout << "NO\n";
            return 0;
          }
          fx = 1;
          assert(abs((negx[it] - posx[it])) <= 1e9);
          v = (negx[it] - posx[it]);
        }
      }
      if (!fx) {
        vector<long long> ve;
        for (auto it : vert) {
          if (usepos[it]) {
            ve.push_back(-posx[it]);
          } else if (useneg[it]) {
            ve.push_back(negx[it]);
          }
        }
        sort(ve.begin(), ve.end());
        v = 2 * ve[ve.size() / 2];
      }
      for (auto it : vert) {
        if (usepos[it]) {
          val[it] = 2 * posx[it] + v;
        } else if (useneg[it]) {
          val[it] = 2 * negx[it] - v;
        } else
          val[it] = 0;
      }
    }
  }
  cout << setprecision(1) << fixed;
  cout << "YES\n";
  for (int i = 1; i <= N; ++i) {
    cout << (double)val[i] / (double)2.00 << ' ';
  }
  cout << '\n';
}
