#include <bits/stdc++.h>
using namespace std;
const int MAX = (const int)(1e3 + 11);
int N;
int C[MAX];
vector<pair<int, int>> adj[MAX];
vector<tuple<int, int, int>> edges;
static int get_leaf(int u, int p1 = -1) {
  for (const auto &pair : adj[u])
    if (pair.first != p1) return get_leaf(pair.first, u);
  return u;
}
static pair<int, int> f(int u, int p) {
  int a1 = -1, a2 = -1;
  for (const auto &pair : adj[u]) {
    if (pair.first == p) continue;
    if (a1 == -1)
      a1 = pair.first;
    else if (a2 == -1)
      a2 = pair.first;
  }
  assert(a1 != -1);
  assert(a2 != -1);
  assert(a1 != a2);
  return {a1, a2};
}
static void solve(std::int32_t test) {
  cin >> N;
  for (int i = 0; i < N - 1; ++i) {
    int u, w, x;
    cin >> u >> w >> x;
    C[u]++;
    C[w]++;
    adj[u].push_back({w, x});
    adj[w].push_back({u, x});
    edges.push_back({u, w, x});
  }
  if (N == 2) {
    cout << "YES\n" << 1 << "\n1 2 " << adj[1][0].second;
    return;
  }
  for (int i = 1; i <= N; ++i) {
    if (C[i] == 2) {
      cout << "NO";
      return;
    }
  }
  vector<tuple<int, int, int>> result;
  for (const auto &edge : edges) {
    const auto u = std::get<0>(edge);
    const auto w = std::get<1>(edge);
    const auto x = std::get<2>(edge);
    if (C[u] == 1) {
      auto aa = f(w, u);
      auto a1 = get_leaf(aa.first, w);
      auto a2 = get_leaf(aa.second, w);
      result.push_back({u, a1, x / 2});
      result.push_back({u, a2, x / 2});
      result.push_back({a1, a2, -x / 2});
      continue;
    }
    if (C[w] == 1) {
      auto aa = f(u, w);
      auto a1 = get_leaf(aa.first, u);
      auto a2 = get_leaf(aa.second, u);
      result.push_back({w, a1, x / 2});
      result.push_back({w, a2, x / 2});
      result.push_back({a1, a2, -x / 2});
      continue;
    }
    const auto aa = f(u, w);
    const auto bb = f(w, u);
    const auto a1 = get_leaf(aa.first, u);
    const auto a2 = get_leaf(aa.second, u);
    const auto b1 = get_leaf(bb.first, w);
    const auto b2 = get_leaf(bb.second, w);
    result.push_back({a1, b1, x / 2});
    result.push_back({a2, b2, x / 2});
    if (a1 != a2) result.push_back({a1, a2, -x / 2});
    if (b1 != b2) result.push_back({b1, b2, -x / 2});
  }
  cout << "YES\n" << result.size();
  for (const auto &row : result)
    cout << "\n"
         << std::get<0>(row) << " " << std::get<1>(row) << " "
         << std::get<2>(row);
}
int main() {
  ios_base::sync_with_stdio(0);
  cout << setprecision(12) << fixed;
  solve(0);
  return 0;
}
