#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> result;
bool check(unordered_map<int, unordered_map<int, int>> &v) {
  for (auto p : v) {
    if (p.second.size() == 2) return false;
  }
  return true;
}
int find_leaf(int start, int prev,
              unordered_map<int, unordered_map<int, int>> &edges, int del = 0) {
  if (edges[start].size() == 1) return start;
  for (auto x : edges[start]) {
    if (x.first != prev) {
      edges[start][x.first] -= del;
      edges[x.first][start] -= del;
      return find_leaf(x.first, start, edges, del);
    }
  }
}
void color_edge(int v, int u,
                unordered_map<int, unordered_map<int, int>> &edges) {
  if (edges[v].size() == 1) {
    int leaf = find_leaf(u, v, edges, edges[v][u]);
    int check = edges[v][u];
    result.push_back({v, leaf, edges[v][u]});
  } else {
    int to_add = edges[v][u] / 2;
    vector<int> vv(2);
    int counter = 0;
    for (auto pair : edges[v]) {
      if (pair.first != u) {
        vv[counter] = pair.first;
        counter++;
      }
      if (counter == 2) break;
    }
    vv[0] = find_leaf(vv[0], v, edges);
    vv[1] = find_leaf(vv[1], v, edges);
    int leaf = find_leaf(u, v, edges, edges[v][u]);
    result.push_back({vv[0], leaf, to_add});
    result.push_back({vv[1], leaf, to_add});
    result.push_back({vv[0], vv[1], -to_add});
  }
}
void color_all(int root, unordered_map<int, unordered_map<int, int>> &edges) {
  queue<pair<int, int>> que;
  que.push({root, (*edges[root].begin()).first});
  while (!que.empty()) {
    auto pair = que.front();
    que.pop();
    color_edge(pair.first, pair.second, edges);
    for (auto p : edges[pair.second]) {
      if (p.first != pair.first) que.push({pair.second, p.first});
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int n;
  cin >> n;
  unordered_map<int, unordered_map<int, int>> edges;
  for (int i = 0; i < n - 1; i++) {
    int x, y, z;
    cin >> x >> y >> z;
    edges[x][y] = z;
    edges[y][x] = z;
  }
  if (!check(edges))
    cout << "NO";
  else {
    cout << "YES\n";
    int root = find_leaf(1, -1, edges);
    color_all(root, edges);
    cout << result.size() << "\n";
    for (auto x : result) {
      for (int i = 0; i < 3; i++) {
        cout << x[i] << " ";
      }
      cout << "\n";
    }
  }
}
