#include <bits/stdc++.h>
using namespace std;
int cnt1, cnt2, h1[500005], h2[500005], f[500005], dep[500005], siz[500005],
    prt[21][500005], son[500005], top[500005], ru[500005], n, vis[500005];
struct edge {
  int to, next;
  edge(int x = 0, int y = 0) : to(x), next(y){};
} p1[500005], p2[500005];
void add1(int x, int y) {
  p1[++cnt1] = edge(y, h1[x]);
  h1[x] = cnt1;
}
void add2(int x, int y) {
  p2[++cnt2] = edge(y, h2[x]);
  h2[x] = cnt2;
}
int get(int x) { return f[x] = f[x] == x ? x : get(f[x]); }
void dfs1(int x, int fa) {
  (dep[x] = dep[fa])++;
  siz[x] = 1;
  prt[0][x] = fa;
  for (int i = h1[x]; i; i = p1[i].next) {
    int y = p1[i].to;
    if (y == fa) continue;
    dfs1(y, x);
    siz[x] += siz[y];
    son[x] = siz[y] > siz[son[x]] ? y : son[x];
  }
}
void dfs2(int x, int fa, int tp) {
  top[x] = tp;
  for (int i = 1; i <= log2(n); i++) prt[i][x] = prt[i - 1][prt[i - 1][x]];
  if (son[x]) dfs2(son[x], x, tp);
  for (int i = h1[x]; i; i = p1[i].next) {
    int y = p1[i].to;
    if (y == fa || y == son[x]) continue;
    dfs2(y, x, y);
  }
}
int lca(int x, int y) {
  while (top[x] != top[y]) {
    dep[top[x]] >= dep[top[y]] ? x = prt[0][top[x]] : y = prt[0][top[y]];
  }
  return dep[x] > dep[y] ? y : x;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add1(x, y);
    add1(y, x);
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add2(x, y);
    add2(y, x);
    ru[x]++;
    ru[y]++;
  }
  dfs1(1, 0);
  dfs2(1, 0, 1);
  queue<int> q;
  for (int i = 1; i <= n; i++) {
    if (ru[i] == 1) q.push(i);
    f[i] = i;
  }
  printf("%d\n", n - 1);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    int v = 0;
    vis[u] = 1;
    for (int i = h2[u]; i; i = p2[i].next) {
      int y = p2[i].to;
      if (!vis[y]) {
        ru[y]--;
        v = y;
        if (ru[y] == 1) q.push(y);
        break;
      }
    }
    if (q.empty()) break;
    int d = lca(u, v);
    int sv = u;
    u = get(u);
    if (dep[u] > dep[d]) {
      printf("%d %d %d %d\n", u, prt[0][u], sv, v);
      f[u] = get(prt[0][u]);
    } else {
      int a = v;
      for (int i = log2(n); i >= 0; i--) {
        if (prt[i][a] && dep[get(prt[i][a])] > dep[d]) a = prt[i][a];
      }
      printf("%d %d %d %d\n", a, prt[0][a], sv, v);
      f[a] = get(prt[0][a]);
    }
  }
}
