#include <bits/stdc++.h>
using namespace std;
vector<int> g[100005], wei[100005];
int e1, e2;
void dfs(int x, int fa) {
  if (g[x].size() == 1) {
    if (!e1) e1 = x;
    e2 = x;
  }
  for (int i = 0; i < g[x].size(); i++) {
    int y = g[x][i];
    if (y != fa) dfs(y, x);
  }
}
struct node {
  int u, v, w;
} ans[100005];
int tot = 0, deg[100005];
void go(int u, int v, int w) {
  if (u == v || !w) return;
  ans[++tot] = node{u, v, w};
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    deg[u]++;
    deg[v]++;
    g[u].push_back(v);
    g[v].push_back(u);
    wei[u].push_back(w / 2);
    wei[v].push_back(w / 2);
  }
  for (int i = 1; i <= n; i++)
    if (deg[i] == 2) {
      printf("NO\n");
      return 0;
    }
  printf("YES\n");
  for (int u = 1; u <= n; u++)
    for (int i = 0; i < g[u].size(); i++) {
      int y = g[u][i], w = wei[u][i];
      if (y > u) continue;
      e1 = e2 = 0;
      dfs(y, u);
      int a1 = e1, a2 = e2;
      e1 = e2 = 0;
      dfs(u, y);
      int b1 = e1, b2 = e2;
      go(a1, b1, w);
      go(a2, b2, w);
      go(a1, a2, -w);
      go(b1, b2, -w);
    }
  printf("%d\n", tot);
  for (int i = 1; i <= tot; i++)
    printf("%d %d %d\n", ans[i].u, ans[i].v, ans[i].w);
  return 0;
}
