#include <bits/stdc++.h>
using namespace std;
namespace fast_IO {
const int IN_LEN = 10000000, OUT_LEN = 10000000;
char ibuf[IN_LEN], obuf[OUT_LEN], *ih = ibuf + IN_LEN, *oh = obuf,
                                  *lastin = ibuf + IN_LEN,
                                  *lastout = obuf + OUT_LEN - 1;
inline char getchar_() {
  return (ih == lastin) &&
                 (lastin = (ih = ibuf) + fread(ibuf, 1, IN_LEN, stdin),
                  ih == lastin)
             ? EOF
             : *ih++;
}
inline void putchar_(const char x) {
  if (oh == lastout) fwrite(obuf, 1, oh - obuf, stdout), oh = obuf;
  *oh++ = x;
}
inline void flush() { fwrite(obuf, 1, oh - obuf, stdout); }
}  // namespace fast_IO
using namespace fast_IO;
inline long long read() {
  register long long x = 0;
  char zf = 1;
  char ch;
  while (ch != '-' && !isdigit(ch)) ch = getchar_();
  if (ch == '-') zf = -1, ch = getchar_();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar_();
  return x * zf;
}
void write(long long y) {
  if (y < 0) putchar_('-'), y = -y;
  if (y > 9) write(y / 10);
  putchar_(y % 10 + 48);
}
void writeln(const long long y) {
  write(y);
  putchar_('\n');
}
int i, j, k, m, n, x, y, z, cnt;
struct ed {
  int x, y, w, h;
} ed[400010];
long long a[500010], c1[500010], c2[500010], F[500010], L[500010], N[500010],
    heavy[500010], id[500010];
void add(const int x, const int y, const int w, const int h) {
  a[++k] = y;
  c1[k] = w, c2[k] = h;
  if (!F[x])
    F[x] = k;
  else
    N[L[x]] = k;
  L[x] = k;
}
long long canup[500010], uped[500010];
void dfs1(const int x, const int pre) {
  for (register int i = F[x]; i; i = N[i])
    if (a[i] != pre) {
      uped[a[i]] = i;
      dfs1(a[i], x);
      heavy[x] += heavy[a[i]];
      int e = heavy[a[i]];
      if (c2[i] < e) {
        cout << -1;
        exit(0);
      }
      int js = min(c2[i] - e, c1[i] - 1);
      canup[i] = js;
      c2[i] -= js;
      c1[i] -= js;
      heavy[x] += c1[i];
    }
}
long long lim[500010], fa[500010];
void init(const int x, const int pre) {
  lim[x] = c2[uped[x]];
  if (x == 1) lim[x] = 99999999999999999ll;
  fa[x] = pre;
  for (register int i = F[x]; i; i = N[i])
    if (a[i] != pre) {
      lim[x] -= heavy[a[i]] + c1[i];
      init(a[i], x);
    }
}
long long adds[500010];
void dfs2(const int x, const int pre, long long canuses) {
  long long canuse = canuses;
  for (register int i = F[x]; i; i = N[i])
    if (a[i] != pre) {
      long long up = min(canuse, min(canup[i], lim[x]));
      c1[i] += up;
      c2[i] += up;
      lim[x] -= up;
      lim[a[i]] += up;
      canuse -= up;
      adds[x] += up;
      dfs2(a[i], x, min(lim[x], min(canuse, lim[a[i]])));
      adds[x] += adds[a[i]];
      canuse = canuses - adds[x];
    }
}
void put(const int x, const int pre) {
  for (register int i = F[x]; i; i = N[i])
    if (a[i] != pre) {
      ed[i].x = x;
      ed[i].y = a[i];
      ed[i].h = c2[i];
      ed[i].w = c1[i];
      put(a[i], x);
    }
}
int main() {
  n = read();
  for (register int i = 1; i < n; i++) {
    x = read();
    y = read();
    int w = read(), h = read();
    add(x, y, w, h);
  }
  dfs1(1, 1);
  init(1, 1);
  fa[1] = 0;
  lim[0] = 99999999999999999ll;
  dfs2(1, 1, 99999999999999999ll);
  writeln(n);
  put(1, 1);
  for (register int i = 1; i < n; i++)
    write(ed[i].x), putchar_(' '), write(ed[i].y), putchar_(' '),
        write(ed[i].w), putchar_(' '), writeln(ed[i].h);
  return flush(), 0;
}
