#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while ('0' <= ch && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return x * f;
}
struct edge {
  int y;
  edge *n;
} e[2000009], *fir[2][500009], *pt = e;
void AddE(int id, int x, int y) {
  pt->y = y, pt->n = fir[id][x], fir[id][x] = pt++;
}
int n, h[2][500009], H[500009];
struct node {
  int a, b, c, d;
} q[500009];
int tot;
int Find(int x) { return H[x] == x ? x : (H[x] = Find(H[x])); }
inline bool Check(int id, int x, int y) {
  return x && y && (h[id][x] == y || h[id][y] == x);
}
inline void Add(int a, int b, int c, int d) { q[++tot] = (node){a, b, c, d}; }
void dfs(int id, int x) {
  for (edge *p = fir[id][x]; p; p = p->n)
    if (p->y != h[id][x]) h[id][p->y] = x, dfs(id, p->y);
}
void dfs(int x) {
  for (edge *p = fir[0][x]; p; p = p->n)
    if (p->y != h[0][x]) {
      dfs(p->y);
      if (!Check(1, x, p->y)) {
        int a = Find(p->y);
        Add(x, p->y, a, h[1][a]);
      }
    }
}
int main() {
  n = read();
  for (int i = 1; i <= n - 1; i++) {
    int x = read(), y = read();
    AddE(0, x, y);
    AddE(0, y, x);
  }
  for (int i = 1; i <= n - 1; i++) {
    int x = read(), y = read();
    AddE(1, x, y);
    AddE(1, y, x);
  }
  dfs(0, 1);
  dfs(1, 1);
  for (int i = 1; i <= n; i++)
    if (Check(0, i, h[1][i]))
      H[i] = h[1][i];
    else
      H[i] = i;
  dfs(1);
  printf("%d\n", tot);
  for (int i = 1; i <= tot; i++)
    printf("%d %d %d %d\n", q[i].a, q[i].b, q[i].c, q[i].d);
  return 0;
}
