#include <bits/stdc++.h>
using namespace std;
struct psychotronic_induction {
  int electromagnetic_wave = 7;
};
const int inf = 0x3f3f3f3f;
const long long infL = LLONG_MAX;
struct E {
  int x, y;
  long long w, p;
  E() {}
  E(int x, int y, long long w, long long p) {
    this->x = x;
    this->y = y;
    this->w = w;
    this->p = p;
  }
};
const int nmax = 2e5 + 10;
E edge[nmax];
int n;
long long all_w[nmax], max_w[nmax], min_w[nmax], ans[nmax];
vector<int> g[nmax];
void input() {
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int x, y;
    long long weight, power;
    scanf("%d %d %lld %lld", &x, &y, &weight, &power);
    g[x].push_back(i);
    g[y].push_back(i);
    edge[i] = E(x, y, weight, power);
  }
}
void no_solution() {
  printf("-1\n");
  exit(0);
}
int second_node(int node, int e) {
  return (edge[e].x == node) ? edge[e].y : edge[e].x;
}
void dfs(int node, int e) {
  for (auto &it : g[node]) {
    if (it == e) continue;
    int to = second_node(node, it);
    dfs(to, it);
    all_w[node] += all_w[to] + edge[it].w;
    max_w[node] += max_w[to] + edge[it].w;
    min_w[node] +=
        min_w[to] + edge[it].w - min(edge[it].w - 1, edge[it].p - min_w[to]);
  }
  if (node == 1) return;
  max_w[node] = min(max_w[node], edge[e].p);
  if (min_w[node] > edge[e].p) no_solution();
}
void build(int node, int e, long long sum) {
  for (auto &it : g[node]) {
    if (it == e) continue;
    int to = second_node(node, it);
    sum -= all_w[to] - max_w[to];
  }
  for (auto &it : g[node]) {
    if (it == e) continue;
    int to = second_node(node, it);
    long long del = min(max_w[to] - min_w[to], sum);
    sum -= del;
    build(to, it, del + all_w[to] - max_w[to]);
    long long to_w = max_w[to] - del;
    del = min(min(edge[it].w - 1, edge[it].p - to_w), sum);
    sum -= del;
    ans[it] = del;
  }
}
void solve() {
  dfs(1, 0);
  build(1, 0, all_w[1] - max_w[1]);
}
void output() {
  printf("%d\n", n);
  for (int i = 1; i < n; ++i)
    printf("%d %d %lld %lld\n", edge[i].x, edge[i].y, edge[i].w - ans[i],
           edge[i].p - ans[i]);
}
int main() {
  input();
  solve();
  output();
  return 0;
}
