#include <bits/stdc++.h>
using namespace std;
const int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
const long long linf = 4000000000000000000LL;
const long long inf = 1000000007;
const long double pi = 3.1415926535;
long long maximum(long long x, long long y) {
  if (x > y) return x;
  return y;
}
long long minimum(long long x, long long y) {
  if (x < y) return x;
  return y;
}
void pv(vector<int> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<long long> a) {
  for (auto& x : a) cout << x << " ";
  cout << '\n';
}
void pv(vector<vector<int>> a) {
  for (int i = (0); i < (a.size()); ++i) {
    cout << i << '\n';
    pv(a[i]);
    cout << '\n';
  }
}
void pv(vector<vector<long long>> a) {
  for (int i = (0); i < (a.size()); ++i) {
    cout << i << '\n';
    pv(a[i]);
  }
  cout << '\n';
}
void pv(vector<string> a) {
  for (auto& x : a) cout << x << '\n';
  cout << '\n';
}
int modInverse(int a, int m) {
  int m0 = m;
  int y = 0, x = 1;
  if (m == 1) return 0;
  while (a > 1) {
    int q = a / m;
    int t = m;
    m = a % m, a = t;
    t = y;
    y = x - q * y;
    x = t;
  }
  if (x < 0) x += m0;
  return x;
}
long long power(long long x, long long y) {
  long long k = 1 << 30;
  long long z = 1;
  while (k != 0) {
    z *= z;
    z %= inf;
    if (y >= k) {
      z *= x;
      z %= inf;
      y -= k;
    }
    k >>= 1;
  }
  return z;
}
long double area(pair<int, int> x, pair<int, int> y, pair<int, int> z) {
  return ((long long)x.second * y.first + (long long)y.second * z.first +
          (long long)z.second * x.first - (long long)x.first * y.second -
          (long long)y.first * z.second - (long long)z.first * x.second) /
         2.0;
}
bool clockwise(pair<int, int> x, pair<int, int> y, pair<int, int> z) {
  return area(x, y, z) > 0;
}
struct point {
  long double x, y;
};
long double area(point x, point y, point z) {
  return (x.y * y.x + y.y * z.x + z.y * x.x - x.x * y.y - y.x * z.y -
          z.x * x.y) /
         2.0;
}
bool clockwise(point x, point y, point z) { return area(x, y, z) > 0; }
int gcd(int a, int b) {
  if (a > b) swap(a, b);
  if (a == 0) return b;
  return gcd(a, b % a);
}
int popcount(int a) {
  int count = 0;
  while (a != 0) {
    count += (a % 2);
    a >>= 1;
  }
  return count;
}
long long choose(long long n, long long r) {
  long long p = 1, k = 1;
  if (n - r < r) r = n - r;
  if (r != 0) {
    while (r) {
      p *= n;
      k *= r;
      long long m = gcd(p, k);
      p /= m;
      k /= m;
      n--;
      r--;
    }
  } else
    p = 1;
  return p;
}
vector<long long> prefix_hash(string& a, vector<long long>& powers) {
  int n = int(a.size());
  vector<long long> prefix(n + 1);
  for (int i = (0); i < (n); ++i)
    prefix[i + 1] = (prefix[i] + powers[i] * (a[i] - 'a' + 1)) % inf;
  return prefix;
}
void setIO(string second) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
}
struct edge {
  int x, len;
};
int n, m;
vector<vector<edge>> adj;
vector<int> type;
vector<long double> ans;
vector<pair<int, int>> val;
int flag = 0;
void dfs(int i) {
  for (auto& x : adj[i]) {
    if (val[x.x].first == 0) {
      type[x.x] = type[i];
      val[x.x].first = -val[i].first;
      val[x.x].second = x.len - val[i].second;
      dfs(x.x);
    } else {
      if (val[x.x].first + val[i].first == 0) {
        if (val[x.x].second + val[i].second != x.len) flag = 1;
      } else {
        int curr = (x.len - val[x.x].second - val[i].second) /
                   (val[x.x].first + val[i].first);
        if (ans[type[i]] == inf)
          ans[type[i]] = curr;
        else {
          if (curr != ans[type[i]]) flag = 1;
        }
      }
    }
  }
}
int main() {
  setIO("test1");
  cin >> n >> m;
  adj.resize(n);
  for (int i = (0); i < (m); ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    adj[--a].push_back({--b, c << 1});
    adj[b].push_back({a, c << 1});
  }
  type.resize(n);
  val.resize(n, {0, 0});
  ans.resize(n, inf);
  for (int i = (0); i < (n); ++i) {
    if (val[i].first == 0) {
      type[i] = i;
      val[i] = {1, 0};
      dfs(i);
    }
  }
  if (flag) {
    cout << "NO" << '\n';
    return 0;
  }
  cout << "YES" << '\n';
  vector<vector<int>> dist(n);
  for (int i = (0); i < (n); ++i) {
    if (ans[type[i]] == inf) {
      dist[type[i]].push_back(-val[i].second * val[i].first);
    }
  }
  for (auto& x : dist) sort(x.begin(), x.end());
  for (int i = (0); i < (n); ++i) {
    if (type[i] != i || ans[i] != inf) continue;
    if (int(dist[i].size()) & 1)
      ans[i] = dist[type[i]][int(dist[i].size()) / 2];
    else {
      ans[i] = (dist[type[i]][int(dist[i].size()) / 2 - 1] +
                dist[type[i]][int(dist[i].size()) / 2]) /
               2.0;
    }
  }
  for (int i = (0); i < (n); ++i) {
    if (type[i] != i) {
      ans[i] = ans[type[i]] * val[i].first + val[i].second;
    }
  }
  for (auto& x : ans) cout << x / 2.0 << " ";
}
