#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v;
  long long w, p;
  edge(int _u = 0, int _v = 0, long long _w = 0, long long _p = 0)
      : u(_u), v(_v), w(_w), p(_p) {}
};
const int N = (int)2e5 + 5;
int n, pos[N], tin[N], tout[N], timer;
long long tree[N];
vector<pair<int, int> > g[N];
deque<int> q[N];
pair<int, int> par[N];
edge e[N];
void update(int idx, long long val) {
  for (; idx <= n; idx += idx & -idx) tree[idx] += val;
}
long long read(int idx) {
  long long ans = 0;
  for (; idx; idx -= idx & -idx) ans += tree[idx];
  return ans;
}
void dfs_prep(int u) {
  tin[u] = ++timer;
  for (pair<int, int> v : g[u]) dfs_prep(v.first);
  tout[u] = timer;
}
bool dfs_calc(int u) {
  int cur = par[u].second;
  for (pair<int, int> v : g[u]) {
    if (!dfs_calc(v.first)) return false;
    int tmp = v.second;
    if (((int)q[pos[tmp]].size()) > ((int)q[pos[cur]].size()))
      swap(pos[cur], pos[tmp]);
    while (((int)q[pos[tmp]].size())) {
      q[pos[cur]].push_back(q[pos[tmp]].front());
      q[pos[tmp]].pop_front();
    }
  }
  deque<int> &q2 = q[pos[cur]];
  long long sum = read(tout[u]) - read(tin[u]);
  while (((int)q2.size()) && sum > e[cur].p) {
    int tmp = q2.front();
    long long tmpsum = read(tout[e[tmp].v]) - read(tin[e[tmp].v]);
    long long val = min(sum - e[cur].p, min(e[tmp].w - 1, e[tmp].p - tmpsum));
    e[tmp].w -= val, e[tmp].p -= val, sum -= val;
    update(tin[e[tmp].v], -val);
    if (e[tmp].w == 1 || tmpsum == e[tmp].p) q2.pop_front();
  }
  q2.push_back(cur), update(tin[u], e[cur].w);
  return (sum <= e[cur].p);
}
int main() {
  scanf("%d", &n);
  for (int i = (1); i < (n); ++i) {
    int u, v, w, p;
    scanf("%d%d%d%d", &u, &v, &w, &p);
    e[i] = edge(u, v, w, p);
    par[v] = pair<int, int>(u, i), pos[i] = i;
    g[u].push_back(pair<int, int>(v, i));
  }
  dfs_prep(1);
  for (pair<int, int> v : g[1]) {
    bool tmp = dfs_calc(v.first);
    if (!tmp) {
      printf("-1");
      return 0;
    }
  }
  printf("%d\n", n);
  for (int i = (1); i < (n); ++i)
    printf("%d %d %I64d %I64d\n", e[i].u, e[i].v, e[i].w, e[i].p);
  return 0;
}
