#include <bits/stdc++.h>
using namespace std;
template <typename T, typename S>
inline bool upmin(T& a, const S& b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T, typename S>
inline bool upmax(T& a, const S& b) {
  return a < b ? a = b, 1 : 0;
}
template <typename N, typename PN>
inline N flo(N a, PN b) {
  return a >= 0 ? a / b : -((-a - 1) / b) - 1;
}
template <typename N, typename PN>
inline N cei(N a, PN b) {
  return a > 0 ? (a - 1) / b + 1 : -(-a / b);
}
template <typename N>
N gcd(N a, N b) {
  return b ? gcd(b, a % b) : a;
}
inline void gn(long long& x) {
  int sg = 1;
  char c;
  while (((c = getchar()) < '0' || c > '9') && c != '-')
    ;
  c == '-' ? (sg = -1, x = 0) : (x = c - '0');
  while ((c = getchar()) >= '0' && c <= '9') x = x * 10 + c - '0';
  x *= sg;
}
inline void gn(int& x) {
  long long t;
  gn(t);
  x = t;
}
inline void gn(unsigned long long& x) {
  long long t;
  gn(t);
  x = t;
}
inline void gn(double& x) {
  double t;
  scanf("%lf", &t);
  x = t;
}
inline void gn(long double& x) {
  double t;
  scanf("%lf", &t);
  x = t;
}
inline long long sqr(long long a) { return a * a; }
inline double sqrf(double a) { return a * a; }
int inf = 0x3f3f3f3f;
double eps = 1e-6;
int mo = 1000000007;
int qp(int a, long long b) {
  int n = 1;
  do {
    if (b & 1) n = 1ll * n * a % mo;
    a = 1ll * a * a % mo;
  } while (b >>= 1);
  return n;
}
int n;
struct ed {
  int x, y;
} ea[555555], eb[555555];
int dont[555555];
map<pair<int, int>, int> mae;
struct node {
  int pre, up, ch[2], fl;
  int v, ma;
} t[555555 * 3];
void fl(int x) {
  swap(t[x].ch[0], t[x].ch[1]);
  t[x].fl ^= 1;
}
void pu(int x) {
  t[x].ma = max(max(t[t[x].ch[0]].ma, t[t[x].ch[1]].ma), t[x].v);
}
void pd(int x) {
  if (t[x].fl) {
    fl(t[x].ch[0]);
    fl(t[x].ch[1]);
    t[x].fl = 0;
  }
}
void rot(int x) {
  int y = t[x].pre;
  t[x].up = t[y].up;
  int f = t[y].ch[0] == x;
  t[y].ch[!f] = t[x].ch[f];
  t[t[x].ch[f]].pre = y;
  t[x].pre = t[y].pre;
  t[t[x].pre].ch[t[t[x].pre].ch[1] == y] = x;
  t[x].ch[f] = y;
  t[y].pre = x;
  pu(y);
}
void allpd(int x) {
  if (t[x].pre) allpd(t[x].pre);
  pd(x);
}
void spl(int x) {
  allpd(x);
  int y;
  while (y = t[x].pre) {
    if (!t[y].pre) {
      rot(x);
    } else {
      int f = t[t[y].pre].ch[1] == y;
      if (t[y].ch[f] == x) {
        rot(y);
        rot(x);
      } else {
        rot(x);
        rot(x);
      }
    }
  }
  pu(x);
}
int acc(int x) {
  int y = 0;
  for (; x; y = x, x = t[x].up) {
    spl(x);
    t[t[x].ch[1]].pre = 0;
    t[t[x].ch[1]].up = x;
    t[x].ch[1] = y;
    t[y].pre = x;
    pu(x);
  }
  return y;
}
int gr(int x) {
  x = acc(x);
  while (t[x].ch[0]) {
    x = t[x].ch[0];
    pd(x);
  }
  spl(x);
  return x;
}
int mr(int x) {
  x = acc(x);
  fl(x);
  return x;
}
void lk(int x, int y) { t[mr(y)].up = x; }
void cut(int x, int y) {
  mr(x);
  acc(y);
  spl(x);
  t[y].pre = t[y].up = 0;
  t[x].ch[1] = 0;
  pu(x);
}
int main() {
  gn(n);
  for (int i = (1), _ed = (n); i < _ed; i++) {
    gn(ea[i].x);
    gn(ea[i].y);
    if (ea[i].x > ea[i].y) swap(ea[i].x, ea[i].y);
    mae[make_pair(ea[i].x, ea[i].y)] = 1;
  }
  int nu = n - 1;
  for (int i = (1), _ed = (n); i < _ed; i++) {
    gn(eb[i].x);
    gn(eb[i].y);
    if (eb[i].x > eb[i].y) swap(eb[i].x, eb[i].y);
    if (mae.count(make_pair(eb[i].x, eb[i].y))) {
      dont[i] = 1, nu--;
      mae[make_pair(eb[i].x, eb[i].y)] = 2;
    }
  }
  for (int i = (1), _ed = (n); i < _ed; i++) {
    if (mae[make_pair(ea[i].x, ea[i].y)] == 1) t[n + i].v = t[n + i].ma = i;
    lk(ea[i].x, n + i);
    lk(n + i, ea[i].y);
  }
  printf("%d\n", nu);
  for (int i = (1), _ed = (n); i < _ed; i++)
    if (!dont[i]) {
      int u = eb[i].x, v = eb[i].y;
      mr(u);
      int x = acc(v);
      int id = t[x].ma;
      printf("%d %d %d %d\n", ea[id].x, ea[id].y, u, v);
      cut(ea[id].x, id + n);
      cut(ea[id].y, id + n);
      lk(u, i + n + n);
      lk(v, i + n + n);
    }
  return 0;
}
