#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char now[1 << 16], *S, *T;
  if (T == S) {
    T = (S = now) + fread(now, 1, 1 << 16, stdin);
    if (T == S) return EOF;
  }
  return *S++;
}
inline long long read() {
  register long long x = 0, f = 1;
  char ch = gc();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = gc();
  }
  while (isdigit(ch)) {
    x = (x << 3) + (x << 1) + ch - '0';
    ch = gc();
  }
  return (f == 1) ? x : -x;
}
struct edge {
  int to, nxt;
  long long dis;
} g[1010101];
int root, head[1010101], tot, n, indo[1010101];
inline void made(int from, int to, long long dis) {
  g[++tot].to = to;
  g[tot].nxt = head[from];
  head[from] = tot;
  g[tot].dis = dis;
  indo[to]++;
}
struct node {
  int from, to;
  long long dis;
};
inline void print(node c) { printf("%d %d %lld\n", c.from, c.to, c.dis); }
inline node init(int from, int to, long long dis) {
  return (node){from, to, dis};
}
vector<node> ans;
int dfs(int u, int fa, int fadis) {
  int A = 0, B = 0, sum = 0;
  if (fa && indo[u] == 1) {
    ans.push_back(init(u, root, fadis));
    return u;
  }
  for (int i = head[u]; i; i = g[i].nxt) {
    int v = g[i].to;
    if (v == fa) continue;
    sum += g[i].dis;
    int now = dfs(v, u, g[i].dis);
    if (!A)
      A = now;
    else if (!B)
      B = now;
  }
  if (fadis != sum) {
    if (!fa) return 0;
    ans.push_back(init(A, root, (fadis - sum) / 2));
    ans.push_back(init(B, root, (fadis - sum) / 2));
    ans.push_back(init(A, B, (sum - fadis) / 2));
  }
  return A;
}
signed main() {
  n = read();
  for (int i = 1; i < n; i++) {
    int x = read(), y = read();
    long long z = read();
    made(x, y, z);
    made(y, x, z);
  }
  root = 0;
  for (int i = 1; i <= n; i++) {
    if (indo[i] == 2) {
      puts("NO");
      return 0;
    } else if (indo[i] == 1) {
      root = i;
    }
  }
  dfs(root, 0, 0);
  puts("YES");
  printf("%d\n", (int)ans.size());
  for (auto x : ans) print(x);
  return 0;
}
