#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  char ch = getchar();
  long long s = 0, w = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    s = s * 10 + ch - '0';
    ch = getchar();
  }
  return s * w;
}
double ans[200010];
int vst[200010];
double dis[200010];
int dep[200010], vis[200010];
int n, m, tag = 0;
double sum;
map<int, int> ma[200010];
vector<double> v;
vector<pair<int, int> > e[200010];
vector<int> V;
void DFS(int x) {
  for (auto tmp : e[x]) {
    int y = tmp.first, val = tmp.second;
    if (vst[y]) {
      if (ans[x] + ans[y] != val) {
        tag = 1;
      }
    } else {
      ans[y] = val - ans[x];
      vst[y] = 1;
      DFS(y);
    }
  }
}
inline int check(double x) { return fabs(x) <= 1e-9 ? 1 : 0; }
void dfs(int u, int fa, int fv) {
  dis[u] = fv - dis[fa];
  dep[u] = dep[fa] + 1;
  vis[u] = 1;
  dep[u] & 1 ? v.push_back(-dis[u]) : v.push_back(dis[u]);
  for (auto tmp : e[u]) {
    int v = tmp.first, val = tmp.second;
    if (v == fa) continue;
    if (vis[v]) {
      if (!((dep[u] - dep[v]) & 1)) {
        int sum = dis[u] - dis[v];
        if (vst[u] && !check(ans[u] - (double)(sum + val) / 2)) tag = 1;
        vst[u] = 1;
        ans[u] = (double)(sum + val) / 2;
        V.push_back(u);
      }
    } else
      dfs(v, u, val);
  }
}
int main() {
  n = read(), m = read();
  for (register long long i = 1; i <= m; i++) {
    int x = read(), y = read(), v = read();
    if (ma[x][y]) {
      if (ma[x][y] != v) tag = 1;
      continue;
    }
    ma[x][y] = ma[y][x] = v;
    if (x != y)
      e[x].push_back(make_pair(y, v)), e[y].push_back(make_pair(x, v));
    else {
      if (vst[x] && !check(ans[x] - (double)v / 2)) tag = 1;
      ans[x] = (double)v / 2;
      vst[x] = 1;
      V.push_back(x);
    }
  }
  for (auto x : V) DFS(x);
  V.clear();
  for (register long long i = 1; i <= n; i++) {
    if (!vst[i]) {
      dfs(i, 0, 0);
      if (!V.size()) {
        vst[i] = 1;
        sort(v.begin(), v.end());
        if (v.size() % 2 == 0)
          ans[i] = (v[v.size() / 2 - 1] + v[v.size() / 2]) / 2;
        else
          ans[i] = v[v.size() / 2];
        DFS(i);
      } else {
        for (auto x : V) DFS(x);
        V.clear();
      }
      v.clear();
    }
  }
  for (register long long x = 1; x <= n; x++) {
    for (auto tmp : e[x]) {
      int y = tmp.first, val = tmp.second;
      if (!check(ans[x] + ans[y] - (double)val)) tag = 1;
    }
  }
  if (tag) {
    puts("NO");
    return 0;
  }
  puts("YES");
  for (register long long i = 1; i <= n; i++) printf("%.8lf ", ans[i] + 1e-9);
  puts("");
  return 0;
}
