#include <bits/stdc++.h>
using namespace std;
const int limite = 1000000;
void morir() {
  printf("-1\n");
  exit(0);
}
long long int suma[limite];
void anyade(int pos, long long int val) {
  for (; pos < limite; pos += pos & -pos) suma[pos] += val;
}
long long int sumaantes(int pos) {
  long long int s = 0;
  for (; pos > 0; pos -= pos & -pos) s += suma[pos];
  return s;
}
long long int sumaentre(int pos0, int pos1) {
  if (pos0 > pos1) return 0;
  return sumaantes(pos1) - sumaantes(pos0 - 1);
}
int n;
vector<pair<int, int> > g[limite];
int au[limite];
int av[limite];
int aw[limite];
int ap[limite];
int idarista[limite];
int posri[limite];
int npos = 1;
int eliminado[limite];
int anterior[limite];
int siguiente[limite];
int computaanterior(int pos) {
  if (not eliminado[pos]) return pos;
  anterior[pos] = computaanterior(anterior[pos]);
  return anterior[pos];
}
int computasiguiente(int pos) {
  if (not eliminado[pos]) return pos;
  siguiente[pos] = computasiguiente(siguiente[pos]);
  return siguiente[pos];
}
void genera(int u) {
  int pos = npos;
  vector<pair<int, int> > &ar = g[u];
  anyade(pos, aw[idarista[pos]]);
  for (int i = 0; i < int(ar.size()); i++) {
    int v = ar[i].first;
    int idav = ar[i].second;
    npos++;
    idarista[npos] = idav;
    genera(v);
  }
  posri[pos] = npos;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d %d %d %d", au + i, av + i, aw + i, ap + i);
    g[au[i]].push_back(pair<int, int>(av[i], i));
  }
  genera(1);
  for (int i = 1; i <= npos + 1; i++) {
    siguiente[i] = i + 1;
    anterior[i] = i - 1;
  }
  for (int pos = npos; pos > 1; pos--) {
    int posr = computaanterior(posri[pos]);
    int p = ap[idarista[pos]];
    for (;;) {
      long long int s = sumaentre(pos + 1, posri[pos]);
      if (p >= s) break;
      if (posr <= pos) morir();
      int &ww = aw[idarista[posr]];
      int &pp = ap[idarista[posr]];
      int sr = sumaentre(posr + 1, posri[posr]);
      int quitar = min((ww - 1), pp - sr);
      if (s - quitar <= p) quitar = s - p;
      ww -= quitar;
      pp -= quitar;
      anyade(posr, -quitar);
      if (quitar == 0) eliminado[posr] = 1;
      posr = computaanterior(posr);
    }
  }
  printf("%d\n", n);
  for (int i = 1; i <= n - 1; i++)
    printf("%d %d %d %d\n", au[i], av[i], aw[i], ap[i]);
}
