#include <bits/stdc++.h>
using namespace std;
const long long N = 400010;
inline long long read() {
  long long s = 0, w = 1;
  register char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + (ch - '0'), ch = getchar();
  return s * w;
}
void print(long long x) {
  if (x < 0) x = -x, putchar('-');
  if (x > 9) print(x / 10);
  putchar(x % 10 + '0');
}
long long n, deg[N], root, cnt;
struct Node {
  long long a, b, c;
} h[N];
long long head[N], maxE;
struct Edge {
  long long nxt, to, rdis;
} e[N << 1];
inline void Add(long long u, long long v, long long w) {
  e[++maxE].nxt = head[u];
  head[u] = maxE;
  e[maxE].to = v;
  e[maxE].rdis = w;
}
long long DFS(long long x, long long fa, long long w) {
  long long res;
  long long p, q;
  res = p = q = 0;
  for (long long i = head[x]; i; i = e[i].nxt) {
    if (e[i].to == fa) continue;
    res += e[i].rdis;
    long long gt = DFS(e[i].to, x, e[i].rdis);
    (p ? q : p) = gt;
  }
  if (x == root) return p;
  if (!p)
    p = x, h[++cnt] = (Node){p, root, w};
  else {
    h[++cnt] = (Node){p, q, (res - w) / 2};
    h[++cnt] = (Node){p, root, (w - res) / 2};
    h[++cnt] = (Node){q, root, (w - res) / 2};
  }
  return p;
}
signed main() {
  n = read();
  for (register long long i = 1; i < n; i++) {
    long long u, v, w;
    u = read(), v = read(), w = read();
    Add(u, v, w), Add(v, u, w);
    deg[u]++, deg[v]++;
  }
  for (register long long i = 1; i <= n; i++) {
    if (deg[i] == 2) {
      puts("NO");
      return 0;
    }
    if (deg[i] == 1) root = i;
  }
  puts("YES");
  DFS(root, 0, 0);
  printf("%lld\n", cnt);
  for (register long long i = 1; i <= cnt; i++)
    printf("%lld %lld %lld\n", h[i].a, h[i].b, h[i].c);
  return 0;
}
