#include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f;
const int N = 4e5 + 10;
const int mod = 998244353;
const bool _debug = false;
vector<pair<int, int> > vc[N], ch[N];
vector<pair<pair<int, int>, int> > ans;
vector<int> to[N];
void dfs(int o, int u) {
  to[o].resize(vc[o].size() + 5);
  for (int i = 0; i < vc[o].size(); ++i) {
    pair<int, int> it = vc[o][i];
    if (it.first == u) {
      to[o][i] = -1;
      ch[u].push_back({o, i});
    } else {
      dfs(it.first, o);
      if (vc[it.first].size() == 1)
        to[o][i] = it.first;
      else {
        if (to[it.first][0] == -1)
          to[o][i] = to[it.first][1];
        else
          to[o][i] = to[it.first][0];
      }
    }
  }
}
void dfs1(int o, int u) {
  for (int i = 0; i < ch[o].size(); ++i) {
    if (vc[o][0].first == ch[o][i].first) {
      to[ch[o][i].first][ch[o][i].second] = to[o][1];
    } else {
      to[ch[o][i].first][ch[o][i].second] = to[o][0];
    }
    dfs1(ch[o][i].first, o);
  }
}
void gao(int o, int i, int &x, int &y) {
  if (i == 0) {
    x = to[o][1];
    y = to[o][2];
  } else if (i == 1) {
    x = to[o][0];
    y = to[o][2];
  } else {
    x = to[o][0];
    y = to[o][1];
  }
}
void solve(int o, int u) {
  for (int i = 0, x, y; i < vc[o].size(); ++i) {
    pair<int, int> e = vc[o][i];
    if (e.first == u) continue;
    gao(o, i, x, y);
    if (vc[e.first].size() == 1) {
      ans.push_back({{x, e.first}, e.second / 2});
      ans.push_back({{y, e.first}, e.second / 2});
      ans.push_back({{x, y}, -e.second / 2});
    } else {
      int _x, _y;
      for (int j = 0; j < vc[e.first].size(); ++j) {
        if (vc[e.first][j].first == o) gao(e.first, j, _x, _y);
      }
      ans.push_back({{x, _x}, e.second / 2});
      ans.push_back({{y, _y}, e.second / 2});
      ans.push_back({{x, y}, -e.second / 2});
      ans.push_back({{_x, _y}, -e.second / 2});
    }
    solve(e.first, o);
  }
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1, u, v, w; i < n; ++i) {
    scanf("%d%d%d", &u, &v, &w);
    vc[u].push_back({v, w});
    vc[v].push_back({u, w});
  }
  for (int i = 1; i <= n; ++i)
    if (vc[i].size() == 2) {
      puts("NO");
      return 0;
    }
  int root = 1;
  for (int i = 1; i <= n; ++i)
    if (vc[i].size() >= 3) {
      root = i;
      break;
    }
  if (vc[root].size() == 1) {
    puts("YES");
    printf("%d\n", 1);
    printf("%d %d %d\n", root, vc[root][0].first, vc[root][0].second);
    return 0;
  }
  dfs(root, 0);
  dfs1(root, 0);
  solve(root, 0);
  puts("YES");
  printf("%d\n", ans.size());
  for (auto it : ans)
    printf("%d %d %d\n", it.first.first, it.first.second, it.second);
  return 0;
}
