#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 3;
typedef class Pair3 {
 public:
  int x, y, z;
  Pair3(int x, int y, int z) : x(x), y(y), z(z) {}
} Pair3;
int n;
int d[N], fa[N];
bool ban[N];
vector<int> T[N];
vector<int> leaf;
vector<Pair3> ans;
vector<Pair3> E, nE;
void add(int x, int y, int z, int v) {
  ans.emplace_back(x, y, v);
  ans.emplace_back(x, z, v);
  ans.emplace_back(y, z, -v);
}
int dfs(int p, int fa) {
  int d = T[p].size();
  ::fa[p] = 0;
  for (auto id : T[p]) {
    int e = E[id].x ^ E[id].y ^ p, rt;
    if (e ^ fa) {
      rt = dfs(e, p);
      if (d == 2) {
        if (E[T[p][0]].z ^ E[T[p][1]].z) {
          puts("NO");
          exit(0);
        } else {
          return rt;
        }
      } else {
        nE.emplace_back(p, rt, E[id].z);
        ::fa[rt] = p;
      }
    }
  }
  return p;
}
int get_e(int id, int x) { return E[id].x ^ E[id].y ^ x; }
int get_leaf(int p, int fa) {
  if (T[p].size() == 1) return p;
  int e = get_e(T[p][0], p);
  return get_leaf(get_e(T[p][e == fa], p), p);
}
int main() {
  scanf("%d", &n);
  for (int i = 1, u, v, w; i < n; i++) {
    scanf("%d%d%d", &u, &v, &w);
    E.emplace_back(u, v, w >>= 1);
    d[u]++, d[v]++;
  }
  for (int i = 1; i <= n; i++) {
    if (d[i] == 1) {
      leaf.push_back(i);
    }
  }
  do {
    int x = leaf.back();
    for (int i = 1; i <= n; i++) {
      T[i].clear();
    }
    for (int i = 0; i < (signed)E.size(); i++) {
      if (ban[E[i].x] || ban[E[i].y]) continue;
      T[E[i].x].push_back(i);
      T[E[i].y].push_back(i);
    }
    dfs(x, 0);
    E.clear();
    swap(E, nE);
    for (int i = 1; i <= n; i++) {
      T[i].clear();
    }
    for (int i = 0; i < (signed)E.size(); i++) {
      T[E[i].x].push_back(i);
      T[E[i].y].push_back(i);
    }
    if (leaf.size() == 2) {
      break;
    } else {
      int y = get_e(T[x][0], x), wx = E[T[x][0]].z;
      assert(T[y].size() >= 3);
      if (get_e(T[y][1], y) == x) swap(T[y][1], T[y][0]);
      if (get_e(T[y][2], y) == x) swap(T[y][2], T[y][0]);
      int a = get_e(T[y][1], y), wa = E[T[y][1]].z;
      int b = get_e(T[y][2], y), wb = E[T[y][2]].z;
      a = get_leaf(a, y), b = get_leaf(b, y);
      add(x, a, b, wx);
      if (T[y].size() == 3) {
        add(a, x, b, wa - wb);
        int c = fa[a];
        do {
          for (auto id : T[c]) {
            if (get_e(id, c) == a) {
              E[id].z += wb - wa;
              break;
            }
          }
          a = c, c = fa[c];
        } while (c ^ x);
      }
      ban[x] = true;
      leaf.pop_back();
    }
  } while (true);
  ans.emplace_back(leaf[0], leaf[1], E[T[leaf[0]][0]].z * 2);
  puts("YES");
  printf("%d\n", (signed)ans.size());
  for (auto par : ans) {
    printf("%d %d %d\n", par.x, par.y, par.z);
  }
  return 0;
}
