#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
struct edge {
  int to, idx;
  long long w, s;
  edge() {}
  edge(int a, int b, int c, int d) {
    to = a;
    w = b;
    s = c;
    idx = d;
  }
};
vector<edge> adj[N];
long long sv[N];
long long s[N];
int w[N], from[N], to[N], n2st[N];
int n, u, v, c, p;
void dfs(int u) {
  for (auto v : adj[u]) {
    dfs(v.to);
    sv[u] += w[v.to] + sv[v.to];
  }
  if (sv[u] > s[u]) {
    puts("-1");
    exit(0);
  }
  int max_na2s = (w[u] - 1 < s[u] - sv[u] ? w[u] - 1 : s[u] - sv[u]);
  w[u] -= max_na2s;
  s[u] -= max_na2s;
  n2st[u] = max_na2s;
}
long long dfs(int u, long long cur) {
  long long zwd = (n2st[u] < cur ? n2st[u] : cur);
  w[u] += zwd;
  s[u] += zwd;
  cur -= zwd;
  cur = (cur < s[u] - sv[u] ? cur : s[u] - sv[u]);
  for (auto v : adj[u]) {
    long long el3b = dfs(v.to, cur);
    cur -= el3b;
    zwd += el3b;
  }
  return zwd;
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n - 1; i++) {
    scanf("%d%d%d%d", &u, &v, &c, &p);
    adj[u].push_back(edge(v, c, p, i));
    from[i] = u;
    to[i] = v;
    w[v] = c;
    s[v] = p;
  }
  s[1] = LLONG_MAX;
  dfs(1);
  dfs(1, (long long)(1e18));
  printf("%d\n", n);
  for (int i = 0; i < n - 1; i++) {
    printf("%d %d %d %d\n", from[i], to[i], w[to[i]], s[to[i]]);
  }
  return 0;
}
