#include <bits/stdc++.h>
int N;
int UVV[99999][3];
int UV[199998][2];
int UV_tmp[199998][2];
int UV_cnt[100000];
int UV_B[100001];
int C[100000];
int g(int a, int b) {
  if (C[b] == 1) return b;
  int k = rand() % C[b];
  if (UV[UV_B[b] + k][1] == a) k = (k + 1) % C[b];
  return g(b, UV[UV_B[b] + k][1]);
}
void gg(int *out, int a, int b) {
  int kk[2];
  int k = 0;
  for (int i = UV_B[b]; k < 2; ++i) {
    if (UV[i][1] == a) continue;
    kk[k++] = UV[i][1];
  }
  out[0] = g(b, kk[0]);
  out[1] = g(b, kk[1]);
}
void f1(int a, int b, int c) {
  int ar[2];
  gg(ar, a, b);
  printf("%d %d %d\n", (a) + 1, (ar[0]) + 1, c);
  ;
  printf("%d %d %d\n", (a) + 1, (ar[1]) + 1, c);
  ;
  printf("%d %d %d\n", (ar[0]) + 1, (ar[1]) + 1, -c);
  ;
}
void f(int a, int b, int c) {
  if (C[a] == 1) {
    if (C[b] == 1) {
      printf("%d %d %d\n", (a) + 1, (b) + 1, c * 2);
      ;
    } else {
      f1(a, b, c);
    }
  } else if (C[b] == 1) {
    f1(b, a, c);
  } else {
    int ar[2][2];
    gg(ar[0], a, b);
    gg(ar[1], b, a);
    printf("%d %d %d\n", (ar[0][0]) + 1, (ar[1][0]) + 1, c);
    ;
    printf("%d %d %d\n", (ar[0][0]) + 1, (ar[1][1]) + 1, c);
    ;
    printf("%d %d %d\n", (ar[1][0]) + 1, (ar[1][1]) + 1, -c);
    ;
    printf("%d %d %d\n", (ar[0][0]) + 1, (ar[0][1]) + 1, -c);
    ;
    printf("%d %d %d\n", (ar[0][0]) + 1, (ar[1][1]) + 1, -c);
    ;
    printf("%d %d %d\n", (ar[0][1]) + 1, (ar[1][1]) + 1, c);
    ;
  }
}
int f_cnt(int a, int b, int c) {
  if (C[a] == 1) {
    if (C[b] == 1) {
      return 1;
    } else {
      return 3;
    }
  } else if (C[b] == 1) {
    return 3;
  } else {
    return 6;
  }
}
int main() {
  scanf("%d", &N);
  for (int i = 0; i < N; ++i) {
    C[i] = 0;
    UV_cnt[i] = 0;
  }
  for (int i = 0; i < N - 1; ++i) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    a -= 1;
    b -= 1;
    C[a] += 1;
    C[b] += 1;
    UVV[i][0] = a;
    UVV[i][1] = b;
    UVV[i][2] = c / 2;
    UV_tmp[i * 2][0] = a;
    UV_tmp[i * 2][1] = b;
    UV_tmp[i * 2 + 1][0] = b;
    UV_tmp[i * 2 + 1][1] = a;
    UV_cnt[a] += 1;
    UV_cnt[b] += 1;
  }
  for (int i = 0; i < N; ++i) {
    if (C[i] == 2) goto NO;
  }
  for (int i = 1; i < N; ++i) UV_cnt[i] += UV_cnt[i - 1];
  UV_B[0] = 0;
  for (int i = 0; i < N; ++i) UV_B[i + 1] = UV_cnt[i];
  for (int i = 0; i < N * 2 - 2; ++i) {
    int d = --UV_cnt[UV_tmp[i][0]];
    UV[d][0] = UV_tmp[i][0];
    UV[d][1] = UV_tmp[i][1];
  }
  puts("YES");
  int m;
  m = 0;
  for (int i = 0; i < N - 1; ++i) m += f_cnt(UVV[i][0], UVV[i][1], UVV[i][2]);
  printf("%d\n", m);
  for (int i = 0; i < N - 1; ++i) f(UVV[i][0], UVV[i][1], UVV[i][2]);
  return 0;
NO:
  puts("NO");
  return 0;
}
