#include <bits/stdc++.h>
using namespace std;
inline char gc() {
  static char now[1 << 16], *S, *T;
  if (S == T) {
    T = (S = now) + fread(now, 1, 1 << 16, stdin);
    if (S == T) return EOF;
  }
  return *S++;
}
inline int read() {
  int x = 0, f = 1;
  char c = gc();
  while (c < '0' || c > '9') {
    (c == '-') ? (f = 0) : 0;
    c = gc();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 3) + (x << 1) + (c ^ 48);
    c = gc();
  }
  return f ? x : ((~x) + 1);
}
const int mod = 1e9 + 7;
inline int add(const int &x, const int &y) {
  return (x + y >= mod) ? (x + y - mod) : (x + y);
}
inline void Add(int &x, const int &y) {
  x += y;
  (x >= mod) ? (x -= mod) : 0;
}
inline int sub(const int &x, const int &y) {
  return (x < y) ? (x - y + mod) : (x - y);
}
inline void Sub(int &x, const int &y) {
  x -= y;
  (x < 0) ? (x += mod) : 0;
}
inline int qpow(int a, int b) {
  if (!a) return 0;
  int res = 1;
  for (; b; b >>= 1, a = 1ll * a * a % mod)
    if (b & 1) res = 1ll * res * a % mod;
  return res;
}
const int N = 1010;
int n, deg[N];
struct edge {
  int to, val, nxt;
} e[N << 1];
bool flg[N];
int hd[N], cnt = 1;
inline void addedge(int x, int y, int z) {
  e[++cnt] = (edge){y, z, hd[x]};
  hd[x] = cnt;
}
vector<int> leaf;
void dfs(int x, int fr) {
  if (deg[x] == 1) leaf.push_back(x);
  for (int i = hd[x], y = e[i].to; i; i = e[i].nxt, y = e[i].to)
    if (y ^ fr) {
      dfs(y, x);
      return;
    }
}
inline void find(int x, int fr) {
  leaf.clear();
  for (int i = hd[x], y = e[i].to; i; i = e[i].nxt, y = e[i].to)
    if (y ^ fr) {
      dfs(y, x);
      if (((int)((leaf).size())) == 2) return;
    }
}
struct item {
  int x, y, z;
};
vector<item> ans;
inline void operate(int x, int y, int z) { ans.push_back((item){x, y, z}); }
int main() {
  n = read();
  for (int(i) = (1); (i) <= (n - 1); ++(i)) {
    int x = read(), y = read(), z = read();
    addedge(x, y, z >> 1);
    addedge(y, x, z >> 1);
    ++deg[x];
    ++deg[y];
  }
  for (int(i) = (1); (i) <= (n); ++(i))
    if (deg[i] == 2) {
      puts("NO");
      return 0;
    }
  puts("YES");
  if (n == 2) {
    puts("1");
    printf("%d %d %d\n", 1, 2, e[2].val << 1);
    return 0;
  }
  for (int(i) = (1); (i) <= (n - 1); ++(i)) {
    int u = e[i << 1].to, v = e[i << 1 | 1].to, x = e[i << 1].val;
    if (deg[u] == 1) swap(u, v);
    flg[i] = 1;
    find(u, v);
    int a = leaf[0], b = leaf[1];
    if (deg[v] == 1) {
      operate(a, v, x);
      operate(b, v, x);
      operate(a, b, -x);
    } else {
      find(v, u);
      int c = leaf[0], d = leaf[1];
      operate(a, c, x);
      operate(b, d, x);
      operate(a, b, -x);
      operate(c, d, -x);
    }
    flg[i] = 0;
  }
  printf("%d\n", ((int)((ans).size())));
  for (auto now : ans) {
    printf("%d %d %d\n", now.x, now.y, now.z);
  }
  return 0;
}
