#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int>>> way;
vector<int> leaf;
vector<vector<int>> near_leaf;
vector<int> deep;
void dfs(int v, int p) {
  bool f = false;
  for (pair<int, int> u : way[v]) {
    if (u.first == p) {
      continue;
    }
    deep[u.first] = deep[v] + 1;
    dfs(u.first, v);
    if (near_leaf[v].size() < 5) {
      near_leaf[v].push_back(near_leaf[u.first][0]);
    }
    f = true;
  }
  if (!f) {
    near_leaf[v].push_back(v);
  }
}
int main() {
  int n;
  cin >> n;
  way.resize(n);
  vector<pair<pair<int, int>, int>> reb(n - 1);
  for (int i = 1; i < n; i++) {
    int a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    way[a].push_back({b, c});
    way[b].push_back({a, c});
    reb[i - 1] = {{a, b}, c};
  }
  if (n == 2) {
    cout << "YES\n";
    cout << 1 << "\n";
    cout << 1 << " " << 2 << " " << way[0][0].second;
    return 0;
  }
  leaf.resize(n);
  int kol = 0;
  for (int i = 0; i < n; i++) {
    if (way[i].size() == 2) {
      cout << "NO";
      return 0;
    }
    if (way[i].size() == 1) {
      leaf[i] = 1;
      kol++;
    }
  }
  near_leaf.resize(n);
  int k = 0;
  for (int i = 0; i < n; i++) {
    if (way[i].size() != 1) {
      k = i;
      break;
    }
  }
  deep.resize(n);
  dfs(k, -1);
  cout << "YES"
       << "\n";
  cout << kol * 3 + (n - 1 - kol) * 4 << "\n";
  for (auto i : reb) {
    int a = i.first.first, b = i.first.second;
    int cost = i.second;
    if (leaf[a] == 1) {
      int c = -1, d = -1;
      for (int j : near_leaf[b]) {
        if (j == a) {
          continue;
        }
        if (c == -1) {
          c = j;
        } else if (d == -1) {
          d = j;
          break;
        }
      }
      if (d == -1) {
        int prev = -1;
        for (auto j : way[b]) {
          if (deep[j.first] < deep[b]) {
            prev = j.first;
            break;
          }
        }
        for (int j : near_leaf[prev]) {
          if (j != c && j != a) {
            d = j;
            break;
          }
        }
      }
      a++;
      c++;
      d++;
      cout << a << " " << c << " " << cost / 2 << "\n";
      cout << a << " " << d << " " << cost / 2 << "\n";
      cout << c << " " << d << " " << -cost / 2 << "\n";
    } else if (leaf[b] == 1) {
      int c = -1, d = -1;
      for (int j : near_leaf[a]) {
        if (j == b) {
          continue;
        }
        if (c == -1) {
          c = j;
        } else if (d == -1) {
          d = j;
          break;
        }
      }
      if (d == -1) {
        int prev = -1;
        for (auto j : way[a]) {
          if (deep[j.first] < deep[a]) {
            prev = j.first;
            break;
          }
        }
        for (int j : near_leaf[prev]) {
          if (j != c && j != b) {
            d = j;
            break;
          }
        }
      }
      b++;
      c++;
      d++;
      cout << b << " " << c << " " << cost / 2 << "\n";
      cout << b << " " << d << " " << cost / 2 << "\n";
      cout << c << " " << d << " " << -cost / 2 << "\n";
    } else {
      int c = -1, d = -1, e = -1, f = -1;
      if (deep[a] > deep[b]) {
        swap(a, b);
      }
      for (int j : near_leaf[b]) {
        if (c == -1) {
          c = j;
        } else if (d == -1) {
          d = j;
          break;
        }
      }
      for (int j : near_leaf[a]) {
        if (j == c || j == d) {
          continue;
        }
        if (e == -1) {
          e = j;
        } else if (f == -1) {
          f = j;
          break;
        }
      }
      if (f == -1) {
        int prev = -1;
        for (auto j : way[a]) {
          if (deep[j.first] < deep[a]) {
            prev = j.first;
            break;
          }
        }
        for (int j : near_leaf[prev]) {
          if (j != e && j != c && j != d) {
            f = j;
            break;
          }
        }
      }
      c++;
      d++;
      e++;
      f++;
      cout << c << " " << e << " " << cost / 2 << "\n";
      cout << d << " " << f << " " << cost / 2 << "\n";
      cout << c << " " << d << " " << -cost / 2 << "\n";
      cout << e << " " << f << " " << -cost / 2 << "\n";
    }
  }
  return 0;
}
