#include <bits/stdc++.h>
using namespace std;
const int maxN = 1e5 + 7;
int N, du[maxN], head[maxN], cnt;
vector<pair<pair<int, int>, int>> ans;
struct Eddge {
  int nex, to;
  int val;
  Eddge(int a = -1, int b = 0, int c = 0) : nex(a), to(b), val(c) {}
} edge[maxN << 1];
inline void addEddge(int u, int v, int val) {
  edge[cnt] = Eddge(head[u], v, val);
  head[u] = cnt++;
}
inline void _add(int u, int v, int val) {
  addEddge(u, v, val);
  addEddge(v, u, val);
}
pair<pair<int, int>, int> path[maxN];
inline int dfs(int u, int fa) {
  if (du[u] == 1)
    return u;
  else {
    for (int i = head[u], v; ~i; i = edge[i].nex) {
      v = edge[i].to;
      if (v == fa)
        continue;
      else
        return dfs(v, u);
    }
  }
  return u;
}
inline void init() {
  cnt = 0;
  memset(head, -1, sizeof(head));
}
int main() {
  scanf("%d", &N);
  init();
  for (int i = 1, u, v; i < N; i++) {
    int w;
    scanf("%d%d%d", &u, &v, &w);
    _add(u, v, w);
    du[u]++;
    du[v]++;
    path[i] = make_pair(make_pair(u, v), w);
  }
  for (int i = 1; i <= N; i++)
    if (du[i] == 2) {
      printf("NO\n");
      return 0;
    }
  printf("YES\n");
  for (int i = 1, u, v; i < N; i++) {
    tie(u, v) = path[i].first;
    pair<int, int> UU = {-1, -1};
    for (int j = head[u], tv; ~j; j = edge[j].nex) {
      tv = edge[j].to;
      if (tv == v) continue;
      int tmp = dfs(tv, u);
      if (UU.first == -1)
        UU.first = tmp;
      else if (UU.second == -1) {
        UU.second = tmp;
        break;
      }
    }
    pair<int, int> VV = {-1, -1};
    for (int j = head[v], tu; ~j; j = edge[j].nex) {
      tu = edge[j].to;
      if (tu == u) continue;
      int tmp = dfs(tu, v);
      if (VV.first == -1)
        VV.first = tmp;
      else if (VV.second == -1) {
        VV.second = tmp;
        break;
      }
    }
    if (du[u] == 1) UU = {u, u};
    if (du[v] == 1) VV = {v, v};
    int real = path[i].second / 2;
    ans.push_back(make_pair(make_pair(UU.first, VV.first), real));
    ans.push_back(make_pair(make_pair(UU.second, VV.second), real));
    if (UU.first != UU.second)
      ans.push_back(make_pair(make_pair(UU.first, UU.second), -real));
    if (VV.first != VV.second)
      ans.push_back(make_pair(make_pair(VV.first, VV.second), -real));
  }
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d %d\n", ans[i].first.first, ans[i].first.second,
           ans[i].second);
  return 0;
}
