#include <bits/stdc++.h>
namespace pb_ds {
namespace io {
const int MaxBuff = 1 << 15;
const int Output = 1 << 23;
char B[MaxBuff], *S = B, *T = B;
char Out[Output], *iter = Out;
inline void flush() {
  fwrite(Out, 1, iter - Out, stdout);
  iter = Out;
}
}  // namespace io
template <class Type>
inline Type Read() {
  using namespace io;
  register char ch;
  register Type ans = 0;
  register bool neg = 0;
  while (ch = ((S == T) && (T = (S = B) + fread(B, 1, MaxBuff, stdin), S == T)
                   ? 0
                   : *S++),
         (ch < '0' || ch > '9') && ch != '-')
    ;
  ch == '-' ? neg = 1 : ans = ch - '0';
  while (ch = ((S == T) && (T = (S = B) + fread(B, 1, MaxBuff, stdin), S == T)
                   ? 0
                   : *S++),
         '0' <= ch && ch <= '9')
    ans = ans * 10 + ch - '0';
  return neg ? -ans : ans;
}
template <class Type>
inline void Print(register Type x, register char ch = '\n') {
  using namespace io;
  if (!x)
    *iter++ = '0';
  else {
    if (x < 0) *iter++ = '-', x = -x;
    static int s[100];
    register int t = 0;
    while (x) s[++t] = x % 10, x /= 10;
    while (t) *iter++ = '0' + s[t--];
  }
  *iter++ = ch;
}
}  // namespace pb_ds
using namespace pb_ds;
using namespace std;
const int N = 1005;
const int M = 1e5 + 5;
struct edge {
  int next, to, w;
} a[N << 1];
int head[N], cnt;
inline void add(int u, int v, int w) {
  a[++cnt].to = v;
  a[cnt].next = head[u];
  head[u] = cnt;
  a[cnt].w = w;
}
int n, rt, m, tim;
int las[N], w[N], deg[N];
int s[M], t[M], d[M], sum[N];
int lf[N][2], dfn[N], sz[N];
inline void dfs(int x, int fa) {
  dfn[x] = ++tim, sz[x] = 1;
  lf[x][0] = (deg[x] == 1) ? x : 0;
  for (int i = head[x]; i; i = a[i].next) {
    int y = a[i].to;
    if (y == fa) continue;
    w[y] = las[y] = a[i].w, dfs(y, x);
    w[x] -= las[y], sz[x] += sz[y];
    if (lf[x][0] && lf[y][0])
      lf[x][1] = lf[y][0];
    else if (lf[y][0])
      lf[x][0] = lf[y][0];
  }
}
inline bool chk(int u, int v) {
  return (dfn[u] <= dfn[v] && dfn[u] + sz[u] - 1 >= dfn[v]);
}
int main() {
  n = Read<int>();
  for (int i = 1; i < n; ++i) {
    int u = Read<int>(), v = Read<int>(), w = Read<int>();
    add(u, v, w), add(v, u, w);
    ++deg[u], ++deg[v];
  }
  for (int i = 1; i <= n; ++i)
    if (deg[i] == 1) rt = i;
  dfs(rt, 0);
  for (int i = 1; i <= n; ++i) {
    if (!w[i] || i == rt) continue;
    if (deg[i] == 1) {
      s[++m] = i, t[m] = rt, d[m] = w[i];
      continue;
    }
    if (!lf[i][0] || !lf[i][1]) return puts("NO"), 0;
    s[++m] = lf[i][0], t[m] = rt, d[m] = (w[i] >> 1);
    s[++m] = lf[i][1], t[m] = rt, d[m] = (w[i] >> 1);
    s[++m] = lf[i][0], t[m] = lf[i][1], d[m] = -(w[i] >> 1);
  }
  puts("YES");
  printf("%d\n", m);
  for (int i = 1; i <= m; ++i) printf("%d %d %d\n", s[i], t[i], d[i]);
  return 0;
}
