#include <bits/stdc++.h>
using namespace std;
int n, rt;
struct x {
  int u;
  int v;
  int w;
};
vector<x> ans;
vector<pair<int, int> > g[100005];
int leaf[100005];
void dfs1(int a, int par) {
  leaf[a] = a;
  for (auto p : g[a]) {
    if (p.first == par) continue;
    dfs1(p.first, a);
    leaf[a] = leaf[p.first];
  }
}
pair<int, int> get2(int a, int par) {
  pair<int, int> p = {leaf[g[a][0].first], leaf[g[a][1].first]};
  if (g[a][0].first == par) p.first = leaf[g[a][2].first];
  if (g[a][1].first == par) p.second = leaf[g[a][2].first];
  return p;
}
int get1(int a, int child, int par) {
  int x = g[a][0].first, y = g[a][1].first, z = g[a][2].first;
  if (x != child && x != par) return leaf[x];
  if (y != child && y != par) return leaf[y];
  if (z != child && z != par) return leaf[z];
}
void dfs2(int a, int par) {
  for (auto p : g[a]) {
    if (p.first == par) continue;
    int w = p.second;
    int P = p.first, A = a;
    while (g[P].size() == 2) {
      int P1 = P;
      if (g[P][0].first == A)
        P = g[P][1].first;
      else
        P = g[P][0].first;
      A = P1;
    }
    if (a == rt) {
      if (leaf[P] == P) {
        ans.push_back({a, P, p.second});
        dfs2(P, A);
        continue;
      }
      pair<int, int> leafs = get2(P, A);
      ans.push_back({a, leafs.first, w / 2});
      ans.push_back({a, leafs.second, w / 2});
      ans.push_back({leafs.first, leafs.second, -w / 2});
      dfs2(P, A);
      continue;
    }
    int leaf1 = get1(a, P, par);
    if (leaf[P] == P) {
      ans.push_back({leaf1, P, w / 2});
      ans.push_back({rt, P, w / 2});
      ans.push_back({leaf1, rt, -w / 2});
    } else {
      pair<int, int> leafs = get2(P, A);
      ans.push_back({leaf1, leafs.first, w / 2});
      ans.push_back({rt, leafs.second, w / 2});
      ans.push_back({leaf1, rt, -w / 2});
      ans.push_back({leafs.first, leafs.second, -w / 2});
    }
    dfs2(P, A);
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 1; i < n; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    g[v].push_back({u, w});
  }
  for (int i = 1; i <= n; i++) {
    if (g[i].size() == 2 && g[i][0].second != g[i][1].second) {
      cout << "NO\n";
      return 0;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (g[i].size() == 1) {
      rt = i;
      break;
    }
  }
  dfs1(rt, 0);
  dfs2(rt, 0);
  cout << "YES\n" << ans.size() << '\n';
  for (auto i : ans) cout << i.u << ' ' << i.v << ' ' << i.w << '\n';
  return 0;
}
