#include <bits/stdc++.h>
using namespace std;
int Q, N, M, K, L;
struct Edge {
  long long u, v, w, s;
  long long ow, os;
};
Edge* inp[200001];
vector<Edge*> g[200001];
long long aff[200001];
bool f = false;
long long solve(int n) {
  long long sw = 0;
  for (int i = 0; i < g[n].size(); i++) {
    Edge* e = g[n][i];
    long long w = solve(e->v);
    if (w > e->s) {
      long long mo = w - e->s;
      e->s += mo;
      e->w += mo;
      if (e->s > e->os) f = 1;
    }
    sw += e->w + w;
  }
  return sw;
}
long long dist(int n, long long mstr) {
  long long au = 0;
  for (int i = 0; i < g[n].size(); i++) {
    long long cu = 0;
    Edge* e = g[n][i];
    long long mo = e->os - e->s;
    long long moo = min(mstr, mo);
    e->s += moo;
    e->w += moo;
    cu += moo;
    long long mooo = e->s - aff[e->v];
    cu += dist(e->v, min(mstr - moo, mooo));
    mstr -= cu;
    au += cu;
  }
  return au;
}
long long calc(int n) {
  long long w = 0;
  for (int i = 0; i < g[n].size(); i++) {
    int next = g[n][i]->v;
    w += calc(next) + g[n][i]->w;
  }
  aff[n] = w;
  return w;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> N;
  for (int i = 0; i < N - 1; i++) {
    long long a, b, c, d;
    cin >> a >> b >> c >> d;
    long long m = min(c - 1, d);
    Edge* e = new Edge({a, b, c - m, d - m, c, d});
    inp[i] = e;
    g[a].push_back(e);
  }
  solve(1);
  calc(1);
  dist(1, 5000000000000000000LL);
  if (f) {
    cout << -1;
    return 0;
  }
  cout << N << "\n";
  for (int i = 0; i < N - 1; i++) {
    Edge e = *inp[i];
    if (e.w < 0 || e.s < 0) cout << "Freak out";
  }
  for (int i = 0; i < N - 1; i++) {
    Edge e = *inp[i];
    cout << e.u << " " << e.v << " " << e.w << " " << e.s << "\n";
  }
  cin >> N;
}
