#include <bits/stdc++.h>
using namespace std;
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> p);
template <template <class...> class _TContainer, class... _T>
ostream& operator<<(ostream& out, _TContainer<_T...>& _Container);
struct graph {
 public:
 private:
  int Vcnt;
  vector<vector<pair<long long, int> > > _graph;

 public:
  inline int size() { return Vcnt; }
  inline vector<pair<long long, int> >& adj(int node) { return _graph[node]; }
  inline void addedge(int a, int b, long long w) {
    addedge_onedir(a, b, w);
    addedge_onedir(b, a, w);
  }
  inline void addedge_onedir(int a, int b, long long w) {
    _graph[a].push_back({w, b});
  }
  inline graph(int V) {
    _graph.resize(V);
    Vcnt = V;
  }
};
vector<bool> traversed(1010, 0);
vector<vector<int> > leaf;
vector<vector<int> > ans;
int root = 1;
graph g(1010);
inline void add(int toNode, int val) {
  if (toNode == root) return;
  if (leaf[toNode].size() == 1)
    ans.push_back({root, toNode, val});
  else {
    ans.push_back({root, leaf[toNode][0], val / 2});
    ans.push_back({root, leaf[toNode][1], val / 2});
    ans.push_back({leaf[toNode][0], leaf[toNode][1], -val / 2});
  }
}
inline void dfs(int node) {
  traversed[node] = 1;
  for (auto i : g.adj(node)) {
    if (!traversed[i.second]) {
      dfs(i.second);
      leaf[node].push_back(leaf[i.second][0]);
      traversed[i.second] = 0;
    }
  }
  if (leaf[node].size() == 0) {
    leaf[node].push_back(node);
    return;
  }
  for (auto i : g.adj(node))
    if (!traversed[i.second]) {
      add(i.second, i.first);
      add(node, -i.first);
    }
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n - 1; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    g.addedge(u, v, w);
  }
  for (int i = 1; i <= n; i++)
    if (g.adj(i).size() == 2) {
      cout << "NO";
      return 0;
    }
  cout << "YES"
       << "\n";
  while (g.adj(root).size() != 1) root++;
  leaf.resize(n + 10);
  dfs(root);
  cout << ans.size() << "\n";
  for (auto i : ans) cout << i[0] << " " << i[1] << " " << i[2] << "\n";
}
template <class T1, class T2>
ostream& operator<<(ostream& out, pair<T1, T2> p) {
  return out << '(' << p.first << ',' << p.second << ')';
}
template <template <class...> class _TContainer, class... _T>
ostream& operator<<(ostream& out, _TContainer<_T...>& _Container) {
  out << '[';
  bool first = 1;
  for (auto x : _Container) {
    if (!first) out << ',';
    out << x;
    first = 0;
  }
  out << ']';
  return out;
}
