#include <bits/stdc++.h>
using namespace std;
const long long N = 1111;
vector<pair<long long, long long> > tree[N];
vector<tuple<long long, long long, long long> > ans;
long long cc[N][N];
long long subl[N], par[N];
long long n, root;
void addcc(long long u, long long w) {
  while (u != root) {
    long long p = par[u];
    cc[min(u, p)][max(u, p)] += w;
    u = p;
  }
}
void add(long long l, long long w) {
  addcc(l, w);
  ans.push_back(make_tuple(root, l, w));
}
void add2(long long u, long long l, long long other, long long w) {
  assert(w % 2 == 0);
  addcc(l, w / 2);
  ans.push_back(make_tuple(root, l, w / 2));
  addcc(other, w / 2);
  addcc(l, w / 2);
  addcc(u, -w);
  ans.push_back(make_tuple(other, l, w / 2));
  addcc(other, -w / 2);
  ans.push_back(make_tuple(root, other, -w / 2));
}
long long dfsl(long long u, long long p = 0) {
  par[u] = p;
  if (u != root && tree[u].size() == 1) {
    subl[u] = u;
    return u;
  }
  for (auto e : tree[u]) {
    if (e.first == p) continue;
    subl[u] = dfsl(e.first, u);
  }
  return subl[u];
}
void dfs(long long u, long long p = 0, long long sum = 0) {
  if (u == root) {
    long long v = tree[root][0].first, w = tree[root][0].second;
    add(subl[v], w);
    dfs(tree[root][0].first, root, w);
  } else {
    long long c1 = -1, c2 = -1;
    for (auto e : tree[u]) {
      if (e.first == p) continue;
      long long v = e.first;
      if (c1 == -1) {
        c1 = v;
      } else if (c2 == -1) {
        c2 = v;
        break;
      }
    }
    for (auto e : tree[u]) {
      if (e.first == p) continue;
      long long v = e.first, w = e.second;
      long long need = w - cc[min(u, v)][max(u, v)], l = subl[v];
      long long other = subl[v == c1 ? c2 : c1];
      add2(u, l, other, need);
      dfs(v, u, sum + need);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (long long i = (2); i <= (n); i++) {
    long long u, v, w;
    cin >> u >> v >> w;
    tree[u].push_back(make_pair(v, w));
    tree[v].push_back(make_pair(u, w));
  }
  root = -1;
  for (long long u = (1); u <= (n); u++) {
    if (tree[u].size() == 2) {
      cout << "NO"
           << "\n";
      return 0;
    }
    if (tree[u].size() == 1) {
      root = u;
    }
  }
  dfsl(root);
  dfs(root);
  cout << "YES"
       << "\n"
       << (long long)(ans).size() << "\n";
  for (auto t : ans) {
    cout << get<0>(t) << " " << get<1>(t) << " " << get<2>(t) << "\n";
  }
  return 0;
}
