#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, u, v, w, cur[N], l[N];
vector<pair<int, int> > g[N];
int root, a, b, e1, e2, all;
int s, e, x;
vector<pair<pair<int, int>, int> > ans;
bool add(int node, int prnt) {
  if (node == e) return true;
  for (int i = 0; i < (int)g[node].size(); i++) {
    if (g[node][i].first == prnt) continue;
    if (add(g[node][i].first, node)) {
      cur[g[node][i].second] -= x;
      return true;
    }
  }
  return false;
}
void add(int s, int e, int x) {
  if (x == 0) return;
  ::s = s, ::e = e, ::x = x;
  add(s, -1);
  ans.push_back(make_pair(make_pair(s, e), x));
}
void DFS(int node, int prnt, int pre) {
  if ((int)g[node].size() == 1) {
    l[node] = node;
    return;
  }
  int node1 = -1, node2 = -1;
  if (node == root) node1 = node2 = 0;
  for (int i = 0; i < (int)g[node].size(); i++) {
    if (g[node][i].first != prnt && g[node][i].first != a &&
        g[node][i].first != b) {
      DFS(g[node][i].first, node, g[node][i].second);
      if (node2 != -1) {
        add(a, l[g[node][i].first], cur[g[node][i].second] / 2);
        add(b, l[g[node][i].first], cur[g[node][i].second]);
        continue;
      }
      if (node1 != -1)
        node2 = i;
      else
        node1 = i;
    }
  }
  if (node == root) {
    add(a, b, cur[e1]);
    return;
  }
  int tmp1 = cur[g[node][node1].second];
  int tmp2 = cur[g[node][node2].second];
  int tmp3 = cur[pre];
  add(l[g[node][node1].first], l[g[node][node2].first], -tmp3);
  add(l[g[node][node1].first], a, (-tmp2) / 2);
  add(l[g[node][node1].first], b, (-tmp2) / 2);
  add(l[g[node][node2].first], a, (-tmp1) / 2);
  add(l[g[node][node2].first], b, (-tmp1) / 2);
  tmp1 += tmp2 + tmp3;
  add(l[g[node][node1].first], l[g[node][node2].first], tmp1 / 2);
  add(a, l[g[node][node2].first], tmp1 / 2);
  add(b, l[g[node][node1].first], tmp1 / 2);
  l[node] = l[g[node][node1].first];
}
int main() {
  scanf("%d", &n);
  all = n;
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d%d", &u, &v, &w);
    cur[i] = w;
    g[u].push_back(make_pair(v, i));
    g[v].push_back(make_pair(u, i));
  }
  for (int i = 1; i <= n; i++) {
    if ((int)g[i].size() == 2) {
      if (cur[g[i][0].second] != cur[g[i][1].second]) {
        puts("NO");
        return 0;
      }
      a = g[i][0].first;
      b = g[i][1].first;
      for (int j = 0; j < (int)g[a].size(); j++) {
        if (g[a][j].first == i) g[a][j].first = b;
      }
      for (int j = 0; j < (int)g[b].size(); j++) {
        if (g[b][j].first == i) g[b][j].first = a;
      }
      g[i].clear();
      all--;
    }
  }
  if (all == 2) {
    puts("YES");
    cout << 1 << endl;
    for (int i = 1; i <= n; i++) {
      if ((int)g[i].size() == 1) {
        cout << i << " " << g[i][0].first << " " << cur[g[i][0].second] << endl;
        return 0;
      }
    }
    assert(false);
  }
  for (int i = 1; i <= n; i++) {
    if ((int)g[i].size() < 3) continue;
    a = b = -1;
    for (int j = 0; j < (int)g[i].size() && (b == -1); j++) {
      if ((int)g[g[i][j].first].size() == 1) {
        if (a != -1)
          b = g[i][j].first, e2 = g[i][j].second;
        else
          a = g[i][j].first, e1 = g[i][j].second;
      }
    }
    if (b != -1) {
      root = i;
      break;
    }
  }
  for (int i = 1; i <= n; i++) {
    if (i == a || i == b || (int)g[i].size() > 1) continue;
    add(a, i, cur[e1] - cur[e2]);
    break;
  }
  DFS(root, -1, -1);
  puts("YES");
  printf("%d\n", (int)ans.size());
  for (int i = 0; i < (int)ans.size(); i++) {
    printf("%d %d %d\n", ans[i].first.first, ans[i].first.second,
           ans[i].second);
  }
  return 0;
}
