#include <bits/stdc++.h>
using namespace std;
string alpha = "abcdefghijklmnopqrstuvwxyz";
const int mod = 1e9 + 7;
const int nax = 1010;
vector<unordered_set<int>> g;
stack<int> C;
stack<int> UC;
vector<bool> visited(nax);
void dfs(int u) {
  visited[u] = true;
  for (auto v : g[u]) {
    if (!visited[v]) {
      dfs(v);
    }
  }
}
bool has_cycle(int u) {
  unordered_set<int> visited;
  visited.insert(u);
  unordered_map<int, int> parent;
  parent[u] = u;
  vector<int> frt = {u};
  vector<int> nxt;
  while (!frt.empty()) {
    nxt.clear();
    for (auto u : frt) {
      for (auto v : g[u]) {
        if (!visited.count(v)) {
          parent[v] = u;
          visited.insert(v);
          nxt.push_back(v);
        } else if (parent[u] == v) {
          continue;
        } else {
          return true;
        }
      }
    }
    frt = nxt;
  }
  return false;
}
pair<int, int> get_edge(int u) {
  unordered_set<int> visited;
  visited.insert(u);
  unordered_map<int, int> parent;
  parent[u] = u;
  vector<int> frt = {u};
  vector<int> nxt;
  while (!frt.empty()) {
    nxt.clear();
    for (auto u : frt) {
      for (auto v : g[u]) {
        if (!visited.count(v)) {
          parent[v] = u;
          visited.insert(v);
          nxt.push_back(v);
        } else if (parent[u] == v) {
          continue;
        } else {
          return {v, u};
        }
      }
    }
    frt = nxt;
  }
  assert(false);
  return {0, 0};
}
int cnt;
string res = "";
void unite(int u, int v) {
  cnt++;
  auto p = get_edge(u);
  int a = p.first;
  int b = p.second;
  g[b].erase(a);
  g[a].erase(b);
  g[b].insert(v);
  g[v].insert(b);
  res += to_string(a) + " " + to_string(b) + " " + to_string(b) + " " +
         to_string(v) + '\n';
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  g = vector<unordered_set<int>>(n + 1);
  for (int i = (0); i < (n - 1); i++) {
    int u, v;
    cin >> u >> v;
    g[u].insert(v);
    g[v].insert(u);
  }
  vector<int> roots;
  for (int i = (1); i < (n + 1); i++) {
    if (!visited[i]) {
      roots.push_back(i);
      dfs(i);
    }
  }
  for (auto r : roots) {
    if (has_cycle(r)) {
      C.push(r);
    } else {
      UC.push(r);
    }
  }
  while (!C.empty()) {
    int u, v;
    u = C.top();
    C.pop();
    v = UC.top();
    UC.pop();
    unite(u, v);
    if (has_cycle(u)) {
      C.push(u);
    } else {
      UC.push(u);
    }
  }
  cout << cnt << '\n';
  cout << res;
  return 0;
}
