#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
const int MAXM = 200010;
int n, m;
int anc[MAXN], ancW[MAXN];
int color[MAXN], depth[MAXN];
int U[MAXM], V[MAXM], W[MAXM];
double ans[MAXN];
bool mark[MAXN];
vector<int> side[2];
vector<int> adj[MAXN];
vector<int> weight[MAXN];
void DFSInit(int cur, int p) {
  mark[cur] = true;
  for (int i = 0; i < (int)adj[cur].size(); i++) {
    int viz = adj[cur][i];
    int w = weight[cur][i];
    if (mark[viz]) continue;
    color[viz] = color[cur] ^ 1;
    depth[viz] = depth[cur] + w;
    anc[viz] = cur;
    ancW[viz] = w;
    DFSInit(viz, cur);
  }
}
void DFSCalculate(int cur) {
  mark[cur] = true;
  side[color[cur]].push_back(cur);
  for (int i = 0; i < (int)adj[cur].size(); i++) {
    int viz = adj[cur][i];
    int w = weight[cur][i];
    if (mark[viz]) continue;
    ans[viz] = w - ans[cur];
    DFSCalculate(viz);
  }
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", &U[i], &V[i], &W[i]);
    adj[U[i]].push_back(V[i]);
    adj[V[i]].push_back(U[i]);
    weight[U[i]].push_back(W[i]);
    weight[V[i]].push_back(W[i]);
  }
  for (int i = 1; i <= n; i++)
    if (!mark[i]) DFSInit(i, i);
  memset(mark, false, sizeof(mark));
  for (int i = 1; i <= m; i++) {
    if (mark[U[i]]) continue;
    if (color[U[i]] != color[V[i]]) continue;
    if (depth[U[i]] > depth[V[i]]) swap(U[i], V[i]);
    double sumCycle = depth[V[i]] - depth[U[i]];
    sumCycle += W[i];
    sumCycle /= 2;
    ans[U[i]] = sumCycle;
    bool t = true;
    int cur = V[i];
    while (cur != U[i]) {
      if (t) ans[U[i]] -= ancW[cur];
      t = !t;
      cur = anc[cur];
    }
    DFSCalculate(U[i]);
  }
  for (int i = 1; i <= n; i++) {
    if (mark[i]) continue;
    side[0].clear();
    side[1].clear();
    DFSCalculate(i);
    vector<long long int> v;
    for (int j = 0; j < (int)side[0].size(); j++) v.push_back(-ans[side[0][j]]);
    for (int j = 0; j < (int)side[1].size(); j++) v.push_back(ans[side[1][j]]);
    int sz = (int)v.size();
    sort(v.begin(), v.end());
    long long int med = v[sz / 2];
    for (int j = 0; j < (int)side[0].size(); j++) ans[side[0][j]] += med;
    for (int j = 0; j < (int)side[1].size(); j++) ans[side[1][j]] -= med;
  }
  for (int i = 1; i <= m; i++) {
    if (ans[U[i]] + ans[V[i]] != W[i]) {
      printf("NO\n");
      return 0;
    }
  }
  printf("YES\n");
  for (int i = 1; i <= n; i++) printf("%.10f ", ans[i]);
}
