#include <bits/stdc++.h>
using namespace std;
const int NR = 3e5 + 10;
int n;
int rd[NR];
struct Edge {
  int to, nxt;
} e[NR << 1][2];
int head[NR][2], tot[2];
void add(int x, int y, int op) {
  e[tot[op]][op].to = y, e[tot[op]][op].nxt = head[x][op];
  head[x][op] = tot[op]++;
  rd[x] += op;
}
bool vis[NR];
int dep[NR], lg[NR], f[NR][20];
void dfs(int x, int fa_) {
  dep[x] = dep[fa_] + 1;
  f[x][0] = fa_;
  for (int i = 1; i <= lg[dep[x]]; i++) f[x][i] = f[f[x][i - 1]][i - 1];
  for (int i = head[x][0]; i; i = e[i][0].nxt)
    if (e[i][0].to != fa_) dfs(e[i][0].to, x);
}
int LCA(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  while (dep[x] > dep[y]) x = f[x][lg[dep[x] - dep[y]] - 1];
  if (x == y) return x;
  for (int i = lg[dep[x]]; i >= 0; i--)
    if (f[x][i] ^ f[y][i]) x = f[x][i], y = f[y][i];
  return f[x][0];
}
int fa[NR];
int find(int x) { return (x == fa[x]) ? x : fa[x] = find(fa[x]); }
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = (x << 3) + (x << 1) + (ch ^ 48);
    ch = getchar();
  }
  return x * f;
}
int main() {
  n = read();
  tot[0] = tot[1] = 1;
  for (int i = 1, x, y; i < n; i++)
    x = read(), y = read(), add(x, y, 0), add(y, x, 0);
  for (int i = 1, x, y; i < n; i++)
    x = read(), y = read(), add(x, y, 1), add(y, x, 1);
  for (int i = 1; i <= n; i++) lg[i] = lg[i - 1] + (i == (1 << lg[i - 1]));
  dfs(1, 0);
  queue<int> q;
  for (int i = 1; i <= n; i++)
    if (rd[i] == 1) q.push(i);
  for (int i = 1; i <= n; i++) fa[i] = i;
  printf("%d\n", n - 1);
  while (q.size() > 1) {
    int x = q.front(), y;
    q.pop();
    vis[x] = 1;
    for (int i = head[x][1]; i; i = e[i][1].nxt) {
      int t = e[i][1].to;
      if (vis[t]) continue;
      if (--rd[t] == 1) q.push(t);
      y = t;
    }
    int lca = LCA(x, y), p = find(x);
    if (dep[p] > dep[lca]) {
      printf("%d %d %d %d\n", p, f[p][0], x, y);
      fa[p] = find(f[p][0]);
    } else {
      int a = y;
      for (int i = lg[dep[y]]; i >= 0; i--)
        if (dep[f[a][i]] > dep[lca] && find(f[a][i]) != p) a = f[a][i];
      printf("%d %d %d %d\n", a, f[a][0], x, y);
      fa[a] = p;
    }
  }
  return 0;
}
