#include <bits/stdc++.h>
using namespace std;
const long long BINF = 9e18, LINF = 2e9, mod = 998244353, P = 179,
                Q = 1791791791;
const long long MAXN = 1e4 + 7;
long long a[MAXN], b[MAXN], c[MAXN];
vector<pair<long long, long long>> g[MAXN];
bool cmp(vector<pair<long long, long long>> &a,
         vector<pair<long long, long long>> &b) {
  return a.size() < b.size();
}
struct way {
  long long a, b, c;
};
vector<way> ways;
long long h[MAXN];
long long c1[MAXN], c2[MAXN];
long long f[MAXN];
long long tin[MAXN], tout[MAXN];
long long par[MAXN];
long long timer = 0;
void dfs(long long v, long long p = -1, long long pc = -1) {
  par[v] = p;
  h[v] = (p == -1 ? 0 : h[p] + 1);
  tin[v] = timer++;
  if (g[v].size() == 1 && p != -1) {
    long long u, c;
    for (pair<long long, long long> e : g[v])
      if (e.first != p) u = e.first, c = e.second;
    if (pc != c) {
      cout << "NO";
      exit(0);
    }
    dfs(u, p, pc);
    return;
  }
  for (pair<long long, long long> e : g[v]) {
    if (e.first == p) continue;
    dfs(e.first, v, e.second);
    if (c1[v] == -1)
      c1[v] = f[e.first];
    else if (c2[v] == -1)
      c2[v] = f[e.first];
    f[v] = f[e.first];
  }
  tout[v] = timer++;
  if (p != -1) ways.push_back(way{p, v, pc});
  if (g[v].size() == 0) f[v] = c1[v] = c2[v] = v;
}
void dfsd(long long v, long long p = -1) {
  long long ps = -1;
  for (long long i = 0; i < g[v].size(); ++i) {
    if (g[v][i].first == p)
      ps = i;
    else
      dfsd(g[v][i].first, v);
  }
  if (ps != -1) g[v].erase(g[v].begin() + ps);
}
vector<way> answ;
void add(long long a, long long b, long long c) {
  if (a == b) return;
  answ.push_back({a, b, c});
}
long long lca(long long a, long long b) {
  if (h[a] < h[b]) swap(a, b);
  while (h[a] > h[b]) a = par[a];
  while (a != b) a = par[a], b = par[b];
  return a;
}
long long dist(long long a, long long b) {
  return h[a] + h[b] - 2 * h[lca(a, b)];
}
void solve() {
  long long n;
  cin >> n;
  fill(c1, c1 + n, -1);
  fill(c2, c2 + n, -1);
  for (long long i = 0; i < n - 1; ++i) {
    cin >> a[i] >> b[i] >> c[i];
    --a[i];
    --b[i];
    g[a[i]].push_back({b[i], c[i]});
    g[b[i]].push_back({a[i], c[i]});
  }
  long long root = min_element(g, g + n, cmp) - g;
  dfsd(root, -1);
  dfs(root);
  for (way w : ways) {
    if (h[w.a] > h[w.b]) swap(w.a, w.b);
    long long lul = c1[w.a];
    if (dist(lul, w.b) != dist(lul, w.a) + dist(w.a, w.b)) lul = c2[w.a];
    if (lul == -1) lul = root;
    add(c1[w.b], c2[w.b], -(w.c / 2));
    add(root, lul, -(w.c / 2));
    add(root, c1[w.b], w.c / 2);
    add(lul, c2[w.b], w.c / 2);
  }
  cout << "YES\n";
  cout << answ.size() << "\n";
  for (way w : answ) cout << w.a + 1 << " " << w.b + 1 << " " << w.c << "\n";
  return;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cout.precision(40);
  solve();
  return 0;
}
