#include <bits/stdc++.h>
using namespace std;
struct Node {
  int a, b, c;
  Node(int a = 0, int b = 0, int c = 0) : a(a), b(b), c(c) {}
};
const int maxn = 1e3 + 5;
vector<int> G[maxn];
int N, edges[maxn][3], an = 0;
Node ans[maxn * 100];
int dfs(int x, int f) {
  if (G[x].size() == 1) return x;
  for (int i = 0; i < G[x].size(); i++) {
    if (G[x][i] != f) return dfs(G[x][i], x);
  }
}
int main() {
  scanf("%d", &N);
  int a, b, c;
  for (int i = 0; i < N - 1; i++) {
    scanf("%d%d%d", &a, &b, &c);
    edges[i][0] = a;
    edges[i][1] = b;
    edges[i][2] = c;
    G[a].push_back(b);
    G[b].push_back(a);
  }
  for (int i = 1; i <= N; i++) {
    if (G[i].size() == 2) {
      puts("NO");
      return 0;
    }
  }
  for (int i = 0; i < N - 1; i++) {
    a = edges[i][0];
    b = edges[i][1];
    c = edges[i][2];
    if (G[a].size() == 1 && G[b].size() == 1)
      ans[an++] = Node(a, b, c);
    else if (G[a].size() == 1 || G[b].size() == 1) {
      int v = G[a].size() == 1 ? a : b;
      int t = G[a].size() == 1 ? b : a;
      int u[2], cnt = 0;
      for (int j = 0; j < G[t].size() && cnt < 2; j++) {
        if (G[t][j] == v) continue;
        u[cnt++] = dfs(G[t][j], t);
      }
      ans[an++] = Node(v, u[0], c / 2);
      ans[an++] = Node(v, u[1], c / 2);
      ans[an++] = Node(u[0], u[1], -1 * c / 2);
    } else {
      int v[2], u[2], vn = 0, un = 0;
      for (int j = 0; j < G[a].size() && vn < 2; j++) {
        if (G[a][j] == b) continue;
        v[vn++] = dfs(G[a][j], a);
      }
      for (int j = 0; j < G[b].size() && un < 2; j++) {
        if (G[b][j] == a) continue;
        u[un++] = dfs(G[b][j], b);
      }
      ans[an++] = Node(v[0], u[0], c / 2);
      ans[an++] = Node(v[1], u[1], c / 2);
      ans[an++] = Node(u[0], u[1], -1 * c / 2);
      ans[an++] = Node(v[0], v[1], -1 * c / 2);
    }
  }
  printf("YES\n%d\n", an);
  for (int i = 0; i < an; i++) {
    printf("%d %d %d\n", ans[i].a, ans[i].b, ans[i].c);
  }
}
