#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
using std::abs;
using std::cerr;
using std::cin;
using std::cout;
using std::map;
using std::max;
using std::min;
using std::pair;
using std::set;
using std::string;
using std::swap;
using std::vector;
using ll = long long;
using uint = unsigned int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
template <typename T>
void _dbg(const char* _s, T _h) {
  cerr << _s << " = " << _h << "\n";
}
template <typename T, typename... Ts>
void _dbg(const char* _s, T _h, Ts... _t) {
  int _b = 0;
  while (((_b += *_s == '(') -= *_s == ')') != 0 || *_s != ',') cerr << *_s++;
  cerr << " = " << _h << ",";
  _dbg(_s + 1, _t...);
}
struct init {
  init() {
    cin.tie(0);
    std::iostream::sync_with_stdio(0);
    cout << std::fixed << std::setprecision(10);
    cerr << std::fixed << std::setprecision(5);
  }
  ~init() {}
} init;
const int MAXN = 2e5 + 5;
const ll INF = 1e16;
template <class T, class plus = std::plus<T>, class minus = std::minus<T>>
struct fenwick_tree {
  ll n;
  T E;
  vector<T> tree;
  fenwick_tree(ll _n, T _E = T()) : n(_n), E(_E) { tree.assign(n + 1, E); }
  fenwick_tree(const vector<ll>& a, T _E = T()) : n((ll)a.size()), E(_E) {
    tree.assign(n + 1, E);
    for (ll i = 0; i < n; ++i) add(i + 1, a[i]);
  }
  inline T get(ll i) {
    T res = E;
    for (; i; i -= i & -i) res = plus()(res, tree[i]);
    return res;
  }
  inline void add(ll i, T x) {
    for (; i <= n; i += i & -i) tree[i] = plus()(tree[i], x);
  }
  inline T get(ll l, ll r) { return minus()(get(r), get(l)); }
};
fenwick_tree<ll> fwt(MAXN);
ll timer = 0;
ll from[MAXN], to[MAXN], tin[MAXN], tout[MAXN];
ll w[MAXN], p[MAXN];
vector<ll> g[MAXN];
std::deque<pii> s[MAXN];
void no() {
  cout << "-1\n";
  exit(0);
}
void dfs(ll v, ll num = 0, ll d = 0) {
  ;
  tin[v] = ++timer;
  for (ll e : g[v]) {
    dfs(to[e], e, d + 1);
    if (s[to[e]].size() > s[v].size()) swap(s[to[e]], s[v]);
    for (pii i : s[to[e]]) s[v].push_back(i);
  }
  tout[v] = timer;
  while (fwt.get(tin[v], tout[v]) > p[num]) {
    ;
    if (s[v].empty()) no();
    pii pp = s[v].front();
    s[v].pop_front();
    ll need = fwt.get(tin[v], tout[v]) - p[num];
    ll can = min(w[pp.second] - 1, p[pp.second] - fwt.get(tin[to[pp.second]],
                                                          tout[to[pp.second]]));
    ll boom = min(can, need);
    ;
    if (boom <= 0) continue;
    w[pp.second] -= boom;
    p[pp.second] -= boom;
    fwt.add(tin[to[pp.second]], -boom);
    if (w[pp.second] > 1) s[v].push_front(pp);
  }
  if (w[num] > 1) {
    s[v].push_back({d, num});
  }
  fwt.add(tin[v], w[num]);
  ;
}
int32_t main() {
  ll n;
  cin >> n;
  for (ll i = 1; i < n; ++i) {
    cin >> from[i] >> to[i] >> w[i] >> p[i];
    g[from[i]].emplace_back(i);
  }
  p[0] = INF;
  dfs(1);
  cout << n << '\n';
  for (ll i = 1; i < n; ++i)
    cout << from[i] << ' ' << to[i] << ' ' << w[i] << ' ' << p[i] << '\n';
  return cos(1488) - cos(228);
}
