#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline bool chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline bool chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
const int oo = 0x3f3f3f3f;
const int maxn = 500000, maxm = 1000000;
struct edge {
  int first, second, b;
  edge() {}
  edge(const int &_x, const int &_y, const int &_b)
      : first(_x), second(_y), b(_b) {}
};
edge e[maxm + 5];
int n, m;
struct node {
  node *c[2], *p;
  int e[2], E[2];
  bool rev;
  pair<int, int> Max;
  node() : p(NULL), rev(0), Max(make_pair(-1, -1)) {
    memset(c, 0, sizeof c), memset(e, -1, sizeof e), memset(E, -1, sizeof E);
  }
  void update() {
    Max = make_pair(-1, -1);
    for (int i = (0), _end_ = (2); i < _end_; ++i)
      if (c[i])
        Max = max(Max, max(c[i]->Max, make_pair(::e[e[i]].b, e[i]))),
        E[i] = c[i]->E[i];
      else
        E[i] = e[i];
  }
  void flag_rev() {
    rev ^= 1;
    swap(c[0], c[1]);
    swap(e[0], e[1]);
    swap(E[0], E[1]);
  }
  void push_down() {
    if (rev) {
      for (int i = (0), _end_ = (2); i < _end_; ++i)
        if (c[i]) c[i]->flag_rev();
      rev = 0;
    }
  }
  int get_pos() {
    if (!this || !p) return 2;
    for (int i = (0), _end_ = (2); i < _end_; ++i)
      if (p->c[i] == this) return i;
    return 2;
  }
  bool is_root() { return get_pos() >= 2; }
  void setc(node *u, const int &v) {
    if (this && v < 2) c[v] = u;
    if (u) u->p = this;
  }
  void rotate() {
    node *p = this->p;
    bool mark = get_pos();
    p->p->setc(this, p->get_pos());
    p->setc(c[mark ^ 1], mark);
    setc(p, mark ^ 1);
    p->update();
  }
  void relax() {
    static node *tmp[maxn + 5];
    int top = 0;
    node *u = this;
    while (!u->is_root()) tmp[top++] = u, u = u->p;
    u->push_down();
    while (top) tmp[--top]->push_down();
  }
  void splay() {
    relax();
    for (; !is_root(); rotate())
      if (!p->is_root())
        ((p->p->c[0] == p) == (p->c[0] == this) ? p : this)->rotate();
    update();
  }
  node *access() {
    node *u = this, *v = NULL;
    for (; u; v = u, u = u->p) {
      u->splay(), u->setc(v, 1);
      if (v) u->e[1] = v->E[0];
      u->update();
    }
    splay();
    return v;
  }
  void be_root() {
    access();
    flag_rev();
  }
};
node v[maxn + 5];
vector<pair<int, int> > ans;
int to_del = -1;
void del(const int &first) {
  node *a = v + e[first].first, *b = v + e[first].second;
  if (a == b) return;
  to_del = first;
  a->be_root(), b->access();
  b->setc(NULL, 0), a->p = NULL, b->update();
}
void link(const int &first) {
  node *a = v + e[first].first, *b = v + e[first].second;
  if (a == b) return;
  a->be_root(), b->access();
  if (a->p) {
    int t = b->Max.second;
    if (e[t].b > e[first].b) {
      del(t);
      link(first);
    }
  } else
    a->p = b, a->e[0] = first, a->access();
}
set<pair<int, int> > all, all0;
int main() {
  scanf("%d", &n);
  m = 0;
  for (int i = (0), _end_ = (n - 1); i < _end_; ++i) {
    scanf("%d%d", &e[m].first, &e[m].second), --e[m].first, --e[m].second,
        e[m].b = 1;
    if (e[m].first > e[m].second) swap(e[m].first, e[m].second);
    all.insert(make_pair(e[m].first, e[m].second));
    ++m;
  }
  for (int i = (0), _end_ = (n - 1); i < _end_; ++i) {
    scanf("%d%d", &e[m].first, &e[m].second), --e[m].first, --e[m].second,
        e[m].b = 0;
    if (e[m].first > e[m].second) swap(e[m].first, e[m].second);
    all0.insert(make_pair(e[m].first, e[m].second));
    ++m;
  }
  for (int i = (0), _end_ = (n - 1); i < _end_; ++i)
    if (all0.count(make_pair(e[i].first, e[i].second))) e[i].b = 0;
  for (int i = (0), _end_ = (n - 1); i < _end_; ++i) link(i);
  for (int i = (n - 1), _end_ = (m); i < _end_; ++i)
    if (!all.count(make_pair(e[i].first, e[i].second))) {
      link(i);
      ans.push_back(make_pair(to_del, i));
    }
  printf("%d\n", (int((ans).size())));
  for (auto first : ans)
    printf("%d %d %d %d\n", e[first.first].first + 1, e[first.first].second + 1,
           e[first.second].first + 1, e[first.second].second + 1);
  return 0;
}
