#include <bits/stdc++.h>
using namespace std;
int N, A[100001], B[100001], C[100001];
vector<int> adj[100001];
int ignored, ignored2 = -1;
bool done, isLeaf[100001];
vector<int> v;
vector<pair<pair<int, int>, int>> ans;
vector<int> l[100001];
void dfs(int node, int par) {
  for (int x : adj[node])
    if (x != par && x != ignored && x != ignored2) {
      dfs(x, node);
      if (done) return;
    }
  if (isLeaf[node]) {
    done = true;
    v.push_back(node);
  }
}
void dfs2(int node, int par) {
  for (int x : adj[node])
    if (x != par && x != ignored && x != ignored2) {
      dfs2(x, node);
      if (done) return;
    }
  if (isLeaf[node]) {
    l[ignored].push_back(node);
    done = true;
  }
}
int main() {
  int N;
  cin >> N;
  for (int i = 1; i < N; i++) {
    cin >> A[i] >> B[i] >> C[i];
    adj[A[i]].push_back(B[i]);
    adj[B[i]].push_back(A[i]);
  }
  if (N == 2) {
    cout << "YES" << endl;
    cout << 1 << endl;
    cout << A[1] << ' ' << B[1] << ' ' << C[1] << endl;
    return 0;
  }
  for (int i = 1; i <= N; i++) {
    if (adj[i].size() == 2) {
      cout << "NO" << endl;
      return 0;
    }
    if (adj[i].size() == 1) isLeaf[i] = true;
  }
  for (int i = 1; i <= N; i++) {
    ignored = i;
    for (int j : adj[i]) {
      done = false;
      dfs2(j, i);
    }
  }
  for (int i = 1; i < N; i++) {
    if (isLeaf[B[i]]) swap(A[i], B[i]);
    if (isLeaf[A[i]]) {
      int store, store2;
      for (int x : l[B[i]]) {
        if (x != A[i]) {
          store = x;
          break;
        }
      }
      for (int x : l[B[i]]) {
        if (x != A[i] && x != store) {
          store2 = x;
          break;
        }
      }
      ans.push_back({{A[i], store}, C[i] / 2});
      ans.push_back({{A[i], store2}, C[i] / 2});
      ans.push_back({{store, store2}, -C[i] / 2});
    } else {
      ignored = A[i];
      ignored2 = B[i];
      v.clear();
      for (int j : adj[A[i]]) {
        if (j != B[i]) {
          done = false;
          dfs(j, j);
        }
      }
      vector<int> v2;
      for (int x : v) v2.push_back(x);
      v.clear();
      for (int j : adj[B[i]]) {
        if (j != A[i]) {
          done = false;
          dfs(j, j);
        }
      }
      ans.push_back({{v[0], v2[0]}, C[i] / 2});
      ans.push_back({{v[1], v2[1]}, C[i] / 2});
      ans.push_back({{v[0], v[1]}, -C[i] / 2});
      ans.push_back({{v2[0], v2[1]}, -C[i] / 2});
    }
  }
  cout << "YES" << endl;
  cout << ans.size() << endl;
  for (int i = 0; i < (int)ans.size(); i++)
    cout << ans[i].first.first << ' ' << ans[i].first.second << ' '
         << ans[i].second << endl;
  return 0;
}
