#include <bits/stdc++.h>
#pragma warning(disable : 4996)
struct Edge {
  unsigned long a, b, x, y;
  Edge() {}
  Edge(const unsigned long _a, const unsigned long _b, const unsigned long _x,
       const unsigned long _y)
      : a(_a), b(_b), x(_x), y(_y) {}
};
bool FindNonZero(const std::vector<unsigned long>& be, unsigned long& idx) {
  bool bUnvisitedFound = false;
  idx = 0;
  for (unsigned long i = 0; i < be.size() && !bUnvisitedFound; i++) {
    if (!be[i]) {
      idx = i;
      bUnvisitedFound = true;
    }
  }
  return bUnvisitedFound;
}
bool FindLoop(std::vector<std::set<unsigned long> >& links,
              std::vector<unsigned long>& be, const unsigned long idx,
              unsigned long& loopA, unsigned long& loopB) {
  const std::set<unsigned long>& link = links[idx];
  be[idx] = true;
  loopA = idx;
  while (!link.empty()) {
    for (std::set<unsigned long>::const_iterator p = link.begin();
         p != link.end(); ++p) {
      const unsigned long next = *p;
      if (be[next]) {
        loopA = idx;
        loopB = next;
        return true;
      } else {
        links[idx].erase(next);
        links[next].erase(idx);
        if (FindLoop(links, be, next, loopA, loopB)) {
          return true;
        } else {
          break;
        }
      }
    }
  }
  return false;
}
void MarkComp(const std::vector<std::set<unsigned long> >& links,
              std::vector<unsigned long>& be, const unsigned long idx) {
  const std::set<unsigned long>& link = links[idx];
  be[idx] = true;
  for (std::set<unsigned long>::const_iterator p = link.begin();
       p != link.end(); p++) {
    const unsigned long next = *p;
    if (!be[next]) {
      MarkComp(links, be, next);
    }
  }
}
int main() {
  size_t n;
  std::cin >> n;
  std::vector<std::set<unsigned long> > links(n);
  for (size_t i = 0; i < n - 1; i++) {
    unsigned long a, b;
    std::cin >> a >> b;
    a--;
    b--;
    links[a].insert(b);
    links[b].insert(a);
  }
  std::vector<Edge> ans;
  bool bFinished = false;
  while (!bFinished) {
    std::vector<unsigned long> be(n);
    unsigned long loopA = 0, loopB = 0;
    std::vector<std::set<unsigned long> > links_tmp(links);
    unsigned long startIdx;
    bool bLoopFound = false;
    {
      std::vector<unsigned long> be_local(n);
      while (FindNonZero(be_local, startIdx) && !bLoopFound) {
        if (FindLoop(links_tmp, be_local, startIdx, loopA, loopB)) {
          bLoopFound = true;
        }
      }
    }
    if (bLoopFound) {
      MarkComp(links, be, loopA);
      unsigned long nonzeroIdx = 0;
      if (FindNonZero(be, nonzeroIdx)) {
        MarkComp(links, be, nonzeroIdx);
        links[loopA].erase(loopB);
        links[loopB].erase(loopA);
        links[loopA].insert(nonzeroIdx);
        links[nonzeroIdx].insert(loopA);
        ans.push_back(Edge(loopA, loopB, nonzeroIdx, loopA));
      }
    } else {
      bFinished = true;
    }
  }
  std::cout << ans.size() << std::endl;
  for (size_t i = 0; i < ans.size(); i++) {
    const Edge& edge = ans[i];
    std::cout << (edge.a + 1) << ' ';
    std::cout << (edge.b + 1) << ' ';
    std::cout << (edge.x + 1) << ' ';
    std::cout << (edge.y + 1) << std::endl;
  }
}
