#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
using vb = vector<bool>;
using vc = vector<char>;
using vvc = vector<vc>;
using vvi = vector<vi>;
using vvb = vector<vb>;
using vpii = vector<pii>;
using vpll = vector<pll>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vull = vector<ull>;
constexpr int INF = 1e9 + 1e7;
constexpr ll INFl = INF;
constexpr ll INFll = 1e18 + 1e16;
void print() { cout << '\n'; }
template <typename T, typename... Args>
void print(T x, Args... args) {
  cout << x << ' ';
  print(args...);
}
void read() {}
template <typename T, typename... Args>
void read(T x, Args... args) {
  cin >> x;
  read(args...);
}
template <typename T1, typename T2>
ostream& operator<<(ostream& os, pair<T1, T2> x) {
  os << '(' << x.first << ' ' << x.second << ')';
  return os;
}
template <typename T1, typename T2>
istream& operator>>(istream& is, pair<T1, T2>& x) {
  is >> x.first >> x.second;
  return is;
}
template <typename T>
ostream& operator<<(ostream& os, vector<T>& x) {
  for (T& i : x) os << i << ' ';
  return os;
}
template <typename T>
istream& operator>>(istream& is, vector<T>& x) {
  for (T& i : x) is >> i;
  return is;
}
template <typename T1, typename T2>
pair<T1, T2> operator+(const pair<T1, T2>& A, const pair<T1, T2>& B) {
  return {A.first + B.first, A.second + B.second};
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2>& A, const pair<T1, T2>& B) {
  return {A.first - B.first, A.second - B.second};
}
template <typename T1, typename T2>
pair<T1, T2> operator-(const pair<T1, T2>& A) {
  return {-A.first, -A.second};
}
template <typename T1, typename T2>
bool maxe(T1& A, const T2& B) {
  if (B > A) {
    A = B;
    return 1;
  }
  return 0;
}
template <typename T1, typename T2>
bool mine(T1& A, const T2& B) {
  if (B < A) {
    A = B;
    return 1;
  }
  return 0;
}
struct vertex {
  vpii e;
  bool vis = 0;
  bool neg = 0;
  int val = 0;
  ld res;
};
struct spojna {
  vi vertices;
  int pos = 0;
  int neg = 0;
  int X = -INF;
};
int n, m;
vector<vertex> G;
vector<spojna> S;
void broken() {
  cout << "NO" << '\n';
  exit(0);
}
void dfs(int v) {
  G[v].vis = 1;
  S.back().vertices.emplace_back(v);
  ;
  if (G[v].neg)
    S.back().neg++;
  else
    S.back().pos++;
  for (auto [u, c] : G[v].e) {
    if (G[u].vis) {
      if (G[u].neg == G[v].neg) {
        int X = (G[v].neg ? -1 : 1) * (c - G[v].val - G[u].val);
        if (S.back().X == -INF)
          S.back().X = X;
        else if (S.back().X != X)
          broken();
      } else if (G[v].val + G[u].val != c)
        broken();
    } else {
      G[u].neg = !G[v].neg;
      G[u].val = c - G[v].val;
      dfs(u);
    }
  }
}
void setX(int i, ld X) {
  for (auto v : S[i].vertices)
    G[v].res = ld(G[v].val) + (G[v].neg ? -1.0 : 1.0) * X;
}
int calcAny(int i) {
  vi T;
  for (auto v : S[i].vertices) T.emplace_back((G[v].neg ? 1 : -1) * G[v].val);
  sort(T.begin(), T.end());
  return T[T.size() / 2];
}
ll solve() {
  for (auto v = (0); v <= (n - 1); ++v) {
    if (!G[v].vis) {
      S.emplace_back();
      dfs(v);
    }
  }
  for (auto i = (0); i <= (S.size() - 1); ++i) {
    if (S[i].X == -INF) S[i].X = 2 * calcAny(i);
  }
  for (auto i = (0); i <= (S.size() - 1); ++i) setX(i, ld(S[i].X) / 2.0);
  cout << "YES" << '\n';
  for (auto i = (0); i <= (n - 1); ++i) cout << G[i].res << ' ';
  cout << '\n';
  return -INF;
}
void in() {
  cin >> n >> m;
  G.resize(n);
  for (auto i = (1); i <= (m); ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    --a;
    --b;
    G[a].e.emplace_back(b, c);
    G[b].e.emplace_back(a, c);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int noOfTests = 1;
  while (noOfTests-- > 0) {
    in();
    ll result = solve();
    if (result == ll(-'t'))
      cout << "TAK\n";
    else if (result == ll(-'n'))
      cout << "NIE\n";
    else if (result == ll(-'y'))
      cout << "YES\n";
    else if (result == ll(-'o'))
      cout << "NO\n";
    else if (result == ll(-'e'))
      cout << "Popsute\n";
    else if (result != -INF)
      cout << result << '\n';
  }
  return 0;
}
