#include <bits/stdc++.h>
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int n0 = 1003;
int n, leaf[2][n0], deg[n0], w[n0], par[n0];
vector<int> g[n0];
vector<array<int, 3>> op;
array<int, 2> e[n0];
int get(int i, int v) { return e[i][0] ^ e[i][1] ^ v; }
void dfs(int v, int p) {
  if ((int)(g[v]).size() == 1) leaf[0][v] = v;
  for (int i : g[v]) {
    int to = get(i, v);
    if (to == p) continue;
    par[to] = v;
    dfs(to, v);
    if (!leaf[0][v])
      leaf[0][v] = leaf[0][to];
    else if (!leaf[1][v])
      leaf[1][v] = leaf[0][to];
  }
}
bool add(int v, int p, int u, int x) {
  bool res = (v == u);
  for (int i : g[v]) {
    int to = get(i, v);
    if (to == p) continue;
    if (add(to, v, u, x)) {
      res = true;
      w[i] += x;
    }
  }
  return res;
}
void add_op(int v, int u, int x) {
  op.push_back({v, u, x});
  add(v, v, u, -x);
}
vector<int> ed;
int get_leaf(int v, int u) {
  if (par[v] == u && leaf[0][u] == leaf[0][v]) return leaf[1][u];
  return leaf[0][u];
}
void go(int v, int p) {
  if ((int)(g[v]).size() == 1) return;
  for (int i : g[v]) {
    int to = get(i, v);
    if (to == p) continue;
    ed.clear();
    for (int j : g[v]) {
      if (i == j) continue;
      ed.push_back(j);
      if ((int)(ed).size() == 2) break;
    }
    assert((int)(ed).size() == 2);
    int a = leaf[0][to];
    int b = get_leaf(v, get(ed[0], v));
    int c = get_leaf(v, get(ed[1], v));
    int W = w[i];
    add_op(a, b, W / 2);
    add_op(b, c, -W / 2);
    add_op(a, c, W / 2);
  }
  for (int i : g[v]) {
    int to = get(i, v);
    if (to == p) continue;
    go(to, v);
  }
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(NULL);
  cin >> n;
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y >> w[i];
    deg[x]++, deg[y]++;
    g[x].push_back(i), g[y].push_back(i);
    e[i] = {x, y};
  }
  for (int i = 1; i <= n; i++)
    if (deg[i] == 2) return cout << "NO", 0;
  if (n == 2) {
    cout << "YES\n1\n";
    cout << e[1][0] << ' ' << e[1][1] << ' ' << w[1];
    return 0;
  }
  int root = -1;
  for (int i = 1; i <= n; i++)
    if (deg[i] >= 3) root = i;
  dfs(root, root);
  go(root, root);
  cout << "YES\n";
  cout << (int)(op).size() << '\n';
  for (auto& i : op) cout << i[0] << ' ' << i[1] << ' ' << i[2] << '\n';
}
