#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
struct edge {
  int x, y, w, p;
  edge() {}
  void input() { scanf("%d%d%d%d", &x, &y, &w, &p); }
} E[N], EE[N];
int n;
vector<int> G[N];
long long W[N], WW[N];
void dfs(int x, int y, int id, int mi) {
  if (id) {
    int tmp = EE[id].p - E[id].p;
    tmp = min(mi, tmp);
    E[id].p += tmp;
    E[id].w += tmp;
    mi = min(mi - tmp, E[id].p - (int)W[y]);
    WW[id] = tmp;
  }
  for (int i = 0; i < G[y].size(); i++) {
    int ID = G[y][i];
    if (id == 0) mi = 2e9;
    dfs(E[ID].x, E[ID].y, ID, mi);
    mi -= WW[ID];
    WW[id] += WW[ID];
  }
}
void dfs(int x, int y, int id) {
  for (int i = 0; i < G[y].size(); i++) {
    int ID = G[y][i];
    dfs(E[ID].x, E[ID].y, ID);
  }
  if (id == 0) return;
  if (E[id].p < W[y]) {
    puts("-1");
    exit(0);
  }
  long long tmp = min(E[id].p - W[y], (long long)E[id].w - 1);
  E[id].p -= tmp;
  E[id].w -= tmp;
  W[x] += W[y];
  W[x] += E[id].w;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    E[i].input();
    EE[i] = E[i];
    G[E[i].x].push_back(i);
  }
  dfs(0, 1, 0);
  dfs(0, 1, 0, 2e9);
  cout << n << endl;
  for (int i = 1; i < n; i++) {
    printf("%d %d %d %d\n", E[i].x, E[i].y, E[i].w, E[i].p);
  }
}
