#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
vector<pair<int, int> > G[maxn];
vector<int> son[maxn];
long long add[maxn];
struct node {
  int x, y;
  long long z;
};
vector<node> ans;
int root = 1;
int f[maxn];
void adde(int x, int y, int z) {
  G[x].push_back(make_pair(y, z));
  G[y].push_back(make_pair(x, z));
}
int dfs(int x, int fa) {
  f[x] = fa;
  for (int i = 0; i < G[x].size(); ++i) {
    pair<int, int> y = G[x][i];
    if (y.first == fa) continue;
    int tmp = dfs(y.first, x);
    son[x].push_back(tmp);
  }
  if (G[x].size() == 1) {
    return x;
  }
  return son[x][0];
}
void update(int x, int p, int val) {
  while (x != p) {
    add[x] += val;
    x = f[x];
  }
}
void dfs1(int x, int fa) {
  int cnt = 0;
  if (x == root) {
    int y = G[x][0].first;
    if (G[y].size() == 1) {
      ans.push_back((node){x, y, G[x][0].second});
      return;
    }
    long long tmp = G[x][0].second;
    ans.push_back((node){son[y][0], root, tmp / 2});
    ans.push_back((node){son[y][1], root, tmp / 2});
    ans.push_back((node){son[y][0], son[y][1], -tmp / 2});
    dfs1(y, x);
  } else {
    for (int i = 0; i < G[x].size(); ++i) {
      pair<int, int> y = G[x][i];
      if (y.first == fa) continue;
      long long tmp = y.second - add[y.first];
      int tmp1;
      if (cnt == 0)
        tmp1 = 1;
      else
        tmp1 = 0;
      ans.push_back((node){son[x][cnt], root, tmp / 2});
      ans.push_back((node){son[x][cnt], son[x][tmp1], tmp / 2});
      ans.push_back((node){root, son[x][tmp1], -tmp / 2});
      update(son[x][cnt], x, tmp);
      dfs1(y.first, x);
      cnt++;
    }
  }
}
int main() {
  int n;
  int x, y, z;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d%d%d", &x, &y, &z);
    adde(x, y, z);
  }
  for (int i = 1; i <= n; i++) {
    if (G[i].size() == 2) {
      printf("NO\n");
      return 0;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (G[i].size() == 1) {
      root = i;
      break;
    }
  }
  dfs(root, -1);
  dfs1(root, -1);
  printf("YES\n");
  printf("%d\n", ans.size());
  for (int i = 0; i < ans.size(); i++) {
    printf("%d %d %I64d\n", ans[i].x, ans[i].y, ans[i].z);
  }
}
