#include <bits/stdc++.h>
using namespace std;
const int maxn = 2E3 + 5;
int n;
int deg[maxn * 2], hh[maxn];
int tot, haha;
bool dot[maxn];
vector<int> what[maxn];
vector<int> wait;
double w[maxn];
map<pair<int, int>, bool> vis;
inline pair<int, int> M(int x, int y) {
  if (x > y) swap(x, y);
  return make_pair(x, y);
}
struct edge {
  int to, next;
  double w;
};
struct note {
  int x, y;
  double d;
  note(int a = 0, int b = 0, double c = 0) { x = a, y = b, d = c; }
};
vector<note> ans;
struct graph {
  int head[maxn * 2], size;
  edge E[maxn * 2];
  inline void add(int u, int v, double w) {
    E[++size].to = v;
    E[size].next = head[u];
    E[size].w = w;
    head[u] = size;
  }
  void get(int u, int F, int num) {
    for (int i = head[u]; i; i = E[i].next) {
      int v = E[i].to;
      if (v == F) continue;
      if (u == F) {
        w[++num] = E[i].w;
        hh[num] = v;
        get(v, u, num);
      } else
        get(v, u, num);
    }
    if (deg[u] == 1) what[num].push_back(u);
    if (u == F)
      for (int i = 1; i <= num; ++i) {
        if (vis[M(u, hh[i])]) continue;
        if (what[i].size() == 1) {
          int u1 = what[i][0];
          int x = what[i + 1 <= num ? i + 1 : i + 1 - num][0];
          int y = what[i + 2 <= num ? i + 2 : i + 2 - num][0];
          double d = w[i] / 2;
          ans.push_back(note(u1, x, d));
          ans.push_back(note(u1, y, d));
          ans.push_back(note(x, y, -d));
          vis[M(u, hh[i])] = 1;
        } else {
          int u1 = what[i][0], u2 = what[i][what[i].size() - 1];
          int x = what[i + 1 <= num ? i + 1 : i + 1 - num][0];
          int y = what[i + 2 <= num ? i + 2 : i + 2 - num][0];
          double d = w[i] / 2;
          ans.push_back(note(u1, x, d));
          ans.push_back(note(u2, y, d));
          ans.push_back(note(u1, u2, -d));
          ans.push_back(note(x, y, -d));
          vis[M(u, hh[i])] = 1;
        }
      }
  }
  void find(int u, int F, int last) {
    dot[u] = 1;
    if (deg[u] != 2) {
      haha = last;
      wait.push_back(u);
      return;
    }
    for (int i = head[u]; i; i = E[i].next) {
      int v = E[i].to;
      if (v == F) continue;
      if (last == 1) {
        find(v, u, E[i].w);
        last = E[i].w;
      } else if (last == E[i].w)
        find(v, u, E[i].w);
      else {
        cout << "NO" << endl;
        exit(0);
      }
    }
  }
  int sum;
  void getsize(int u, int F) {
    ++sum;
    for (int i = head[u]; i; i = E[i].next) {
      int v = E[i].to;
      if (v == F) continue;
      getsize(v, u);
    }
  }
} source, G;
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 2; i <= n; ++i) {
    int x, y;
    double z;
    cin >> x >> y >> z;
    source.add(x, y, z);
    source.add(y, x, z);
    ++deg[x], ++deg[y];
  }
  int P1 = 1, P2 = 2;
  for (int u = 1; u <= n; ++u) {
    if (deg[u] == 2) {
      if (!dot[u]) {
        source.find(u, u, 1);
        wait.clear();
        G.add(wait[0], wait[1], haha);
        G.add(wait[1], wait[0], haha);
        P1 = wait[0], P2 = wait[1];
      }
      continue;
    }
    for (int i = source.head[u]; i; i = source.E[i].next) {
      int v = source.E[i].to;
      haha = source.E[i].w;
      if (deg[v] != 2) G.add(u, v, source.E[i].w);
    }
  }
  cout << "YES" << endl;
  G.getsize(P1, P1);
  if (G.sum == 2) {
    cout << 1 << endl;
    cout << P1 << " " << P2 << " " << haha << endl;
    return 0;
  }
  for (int u = 1; u <= n; ++u) {
    if (deg[u] == 1) continue;
    for (int i = 1; i <= n; ++i) what[i].clear();
    G.get(u, u, 0);
  }
  int del = 0;
  for (int i = 0; i < ans.size(); ++i)
    if (abs(ans[i].d - 0) <= 0.01) ++del;
  cout << ans.size() - del << endl;
  for (int i = 0; i < ans.size(); ++i)
    if (abs(ans[i].d - 0) > 0.01)
      cout << ans[i].x << " " << ans[i].y << " " << ans[i].d << endl;
  return 0;
}
