#include <bits/stdc++.h>
using namespace std;
const int N = 500001;
int n, cnt, tot1, tot2, h1[N], v1[N << 1], nxt1[N << 1], h2[N], v2[N << 1],
    nxt2[N << 1], deg[N], fa1[N], fa2[N], f1[N], f2[N];
queue<int> q;
inline void add1(int x, int y) {
  v1[++tot1] = y;
  nxt1[tot1] = h1[x];
  h1[x] = tot1;
}
inline void add2(int x, int y) {
  v2[++tot2] = y;
  nxt2[tot2] = h2[x];
  h2[x] = tot2;
}
inline int gf1(int x) { return x == f1[x] ? x : f1[x] = gf1(f1[x]); }
inline int gf2(int x) { return x == f2[x] ? x : f2[x] = gf2(f2[x]); }
void dfs1(int x) {
  for (int i = h1[x]; i; i = nxt1[i]) {
    if (v1[i] != fa1[x]) {
      fa1[v1[i]] = x;
      dfs1(v1[i]);
    }
  }
}
void dfs2(int x) {
  for (int i = h2[x]; i; i = nxt2[i]) {
    if (v2[i] != fa2[x]) {
      fa2[v2[i]] = x;
      dfs2(v2[i]);
      int a = x, b = v2[i];
      if (fa1[a] == b && gf1(a) != gf1(b)) {
        f1[gf1(a)] = gf1(b);
        f2[gf2(b)] = gf2(a);
        cnt--;
      }
      if (fa1[b] == a && gf1(a) != gf1(b)) {
        f1[gf1(b)] = gf1(a);
        f2[gf2(b)] = gf2(a);
        cnt--;
      }
    }
  }
}
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);
    deg[x]++;
    deg[y]++;
  }
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    add2(x, y);
    add2(y, x);
  }
  for (int i = 1; i <= n; i++) f1[i] = f2[i] = i;
  cnt = n - 1;
  dfs1(1);
  dfs2(1);
  printf("%d\n", cnt);
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) q.push(i);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    if (x == 1) continue;
    if (f1[x] == x)
      printf("%d %d %d %d\n", gf1(x), fa1[gf1(x)], gf2(x), fa2[gf2(x)]);
    for (int i = h1[x]; i; i = nxt1[i]) {
      deg[v1[i]]--;
      if (deg[v1[i]] == 1) q.push(v1[i]);
    }
  }
}
