#include <bits/stdc++.h>
using namespace std;
struct dsu {
  long long n;
  vector<long long> p;
  dsu(long long n) : n(n) {}
  void init() {
    p.resize(n);
    for (long long i = 0; i < n; ++i) p[i] = i;
  }
  long long find(long long x) {
    if (x == p[x])
      return x;
    else
      return (p[x] = find(p[x]));
  }
  void unite(long long x, long long y) {
    x = find(x);
    y = find(y);
    p[x] = y;
  }
};
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie();
  cout.tie();
  ;
  long long n;
  cin >> n;
  vector<pair<long long, long long> > bad;
  dsu d(n);
  d.init();
  for (long long i = 0; i < n - 1; ++i) {
    long long x, y;
    cin >> x >> y;
    --x;
    --y;
    if (d.find(x) == d.find(y)) bad.push_back({x, y});
    d.unite(x, y);
  }
  set<long long> comps;
  vector<long long> cps;
  for (long long i = 0; i < n; ++i) {
    comps.insert(d.find(i));
  }
  for (long long x : comps) cps.push_back(x);
  vector<pair<long long, long long> > gd;
  for (long long i = 1; i < cps.size(); ++i) {
    gd.push_back({cps[i], cps[i - 1]});
  }
  if (gd.size() != bad.size()) cout << "FAK";
  cout << gd.size() << endl;
  for (long long i = 0; i < gd.size(); ++i) {
    cout << bad[i].first + 1 << " " << bad[i].second + 1 << " "
         << gd[i].first + 1 << " " << gd[i].second + 1 << endl;
  }
}
