#include <bits/stdc++.h>
using namespace std;
set<int> st[200000 + 7];
set<int>::iterator it;
vector<int> graph[200000 + 7], edge[200000 + 7];
pair<int, int> edges[200000 + 7], path[200000 + 7];
int sid[200000 + 7], prio[200000 + 7], pr_id, can[200000 + 7], neg[200000 + 7],
    rev[200000 + 7];
long long weg[200000 + 7], uwg[200000 + 7];
void dfs(int u, int edg) {
  int v, ed;
  long long wg = 0;
  neg[u] = edg;
  for (int i = 0; i < graph[u].size(); i++) {
    v = graph[u][i];
    ed = edge[u][i];
    dfs(v, ed);
    wg += weg[v];
  }
  if (u == 1) return;
  prio[u] = ++pr_id;
  rev[pr_id] = edg;
  sid[u] = u;
  st[u].insert(pr_id);
  can[edg] = min(1LL * edges[edg].first - 1, edges[edg].second - wg);
  if (can[edg] < 0) {
    puts("-1");
    exit(0);
  }
  weg[u] = wg + edges[edg].first - can[edg];
}
void solve(int u) {
  int v, id1, id2;
  for (int i = 0; i < graph[u].size(); i++) {
    v = graph[u][i];
    solve(v);
    uwg[u] += uwg[v];
    id1 = sid[u];
    id2 = sid[v];
    if (st[id2].size() > st[id1].size()) swap(id1, id2);
    for (it = st[id2].begin(); it != st[id2].end(); it++)
      st[id1].insert(int(*it));
    sid[u] = id1;
  }
  if (u == 1) return;
  int temp;
  while (uwg[u] > edges[neg[u]].second) {
    temp = *st[sid[u]].begin();
    temp = rev[temp];
    if (uwg[u] - can[temp] >= edges[neg[u]].second) {
      edges[temp].first -= can[temp];
      edges[temp].second -= can[temp];
      uwg[u] -= can[temp];
      can[temp] = 0;
      st[sid[u]].erase(st[sid[u]].begin());
    } else {
      int tpv = uwg[u] - edges[neg[u]].second;
      edges[temp].first -= tpv;
      edges[temp].second -= tpv;
      uwg[u] -= tpv;
      can[temp] -= tpv;
    }
  }
  uwg[u] += edges[neg[u]].first;
}
int main() {
  int n, u, v, w, p;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    scanf("%d %d", &u, &v);
    scanf("%d %d", &edges[i].first, &edges[i].second);
    edge[u].push_back(i);
    graph[u].push_back(v);
    path[i] = make_pair(u, v);
  }
  dfs(1, 0);
  solve(1);
  printf("%d\n", n);
  for (int i = 1; i < n; i++)
    printf("%d %d %d %d\n", path[i].first, path[i].second, edges[i].first,
           edges[i].second);
  return 0;
}
