#include <bits/stdc++.h>
using namespace std;
void rf() {}
const int nx[8] = {2, -2, -2, 2, 1, 1, -1, -1};
const int ny[8] = {1, 1, -1, -1, 2, -2, -2, 2};
const int Nx[4] = {0, 0, -1, 1};
const int Ny[4] = {1, -1, 0, 0};
const long long LINF = (long long)5e18;
const int INF = 1e9 + 7;
const int N = 6e5 + 1;
const int MAXN = 1e6 + 50;
const double EPS = 1e-9, PI = 3.14159265359;
inline int get_int() {
  char x = getchar();
  int ret = 0;
  bool neg = 0;
  while (!('0' <= x && x <= '9')) {
    if (x == '-') neg = 1;
    x = getchar();
  }
  while ('0' <= x && x <= '9') {
    ret = ret * 10 + x - '0';
    x = getchar();
  }
  if (neg) ret *= -1;
  return ret;
}
long long dp_min[N], sum[N];
long long g[N];
int n;
struct edge {
  int to, w, c, p;
  edge() {}
  edge(int to_g, int w_g, int c_g) {
    to = to_g;
    w = w_g;
    c = c_g;
    p = 0;
  }
};
vector<edge> v[N];
void gg() {
  cout << -1;
  exit(0);
}
void dfs(int x = 1, long long w = 0, long long cp = LINF) {
  for (auto it : v[x]) {
    dfs(it.to, it.w, it.c);
    sum[x] += sum[it.to];
    dp_min[x] += dp_min[it.to];
  }
  if (dp_min[x] > cp) {
    gg();
  }
  g[x] = max(0ll, sum[x] - cp);
  sum[x] = min(sum[x], (long long)cp);
  sum[x] += w;
  dp_min[x] += w - min(cp - dp_min[x], w - 1ll);
}
void rec(int x, long long ww) {
  g[x] += ww;
  for (auto it : v[x]) {
    long long c = min(g[x], sum[it.to] - dp_min[it.to]);
    rec(it.to, c);
    g[x] -= c;
  }
}
int main() {
  srand(time(0));
  rf();
  cin >> n;
  vector<pair<pair<int, int>, pair<int, int> > > edges;
  for (int i = 1, x, y, w, c; i < n; i++) {
    cin >> x >> y >> w >> c;
    v[x].push_back((edge){y, w, c});
    edges.push_back(make_pair(make_pair(x, y), make_pair(w, c)));
  }
  dfs();
  rec(1, 0);
  cout << n << "\n";
  for (auto it : edges) {
    cout << it.first.first << ' ' << it.first.second << ' '
         << it.second.first - g[it.first.second] << ' '
         << it.second.second - g[it.first.second] << "\n";
  }
  return 0;
}
