#include <bits/stdc++.h>
using namespace std;
struct ww {
  int a, l, ll, cov, id, key;
} a[2000010];
int i, j, k, n, m, an;
int g[2000010];
vector<int> c[2000010];
int t, tt;
set<pair<int, int> > d, gg;
pair<int, int> e[2000010], f[2000010];
inline bool isroot(int x) {
  return !a[x].a || a[a[x].a].l != x && a[a[x].a].ll != x;
}
inline void update(int x) {
  if (!x) return;
  int y = a[x].l, z = a[x].ll;
  if (a[x].key)
    a[x].id = x;
  else
    a[x].id = 0;
  if (a[y].id) a[x].id = a[y].id;
  if (a[z].id) a[x].id = a[z].id;
}
inline void right(int x) {
  int y = a[x].a, z = a[y].a;
  if (a[z].l == y) a[z].l = x;
  if (a[z].ll == y) a[z].ll = x;
  a[x].a = z;
  a[y].a = x;
  a[y].l = a[x].ll;
  a[x].ll = a[a[y].l].a = y;
  update(y);
}
inline void left(int x) {
  int y = a[x].a, z = a[y].a;
  if (a[z].l == y) a[z].l = x;
  if (a[z].ll == y) a[z].ll = x;
  a[x].a = z;
  a[y].a = x;
  a[y].ll = a[x].l;
  a[x].l = a[a[y].ll].a = y;
  update(y);
}
inline void fan(int x) {
  if (!x) return;
  swap(a[x].l, a[x].ll);
  a[x].cov ^= 1;
  update(x);
}
inline void renew(int x) {
  if (!x) return;
  int y = a[x].l, z = a[x].ll;
  if (a[x].cov) fan(y), fan(z);
  a[x].cov = 0;
}
inline void splay(int x) {
  if (!x) return;
  int y, z;
  for (y = x, g[z = 1] = x; !isroot(y); g[++z] = a[y].a, y = a[y].a)
    ;
  for (; z; z--) renew(g[z]);
  for (; !isroot(x);) {
    y = a[x].a, z = a[y].a;
    if (isroot(y))
      if (a[y].l == x)
        right(x);
      else
        left(x);
    else if (a[z].l == y)
      if (a[y].l == x)
        right(y), right(x);
      else
        left(x), right(x);
    else if (a[y].l == x)
      right(x), left(x);
    else
      left(y), left(x);
  }
  update(x);
}
inline int access(int x) {
  int y = 0;
  for (; x; y = x, x = a[x].a) {
    splay(x);
    a[x].ll = y;
    update(x);
  }
  return y;
}
inline int find_l(int x) {
  splay(x);
  for (x = a[x].l; x; x = a[x].ll) {
    renew(x);
    if (!a[x].ll) break;
  }
  splay(x);
  return x;
}
inline void ti(int x) {
  access(x);
  splay(x);
  fan(x);
}
inline void del(int x, int A, int B) {
  ti(x);
  access(A);
  access(B);
  access(x);
  splay(x);
  if (a[x].l || a[x].ll)
    for (;;)
      ;
  splay(A);
  splay(B);
  if (a[A].a != x || a[B].a != x)
    for (;;)
      ;
  a[A].a = a[B].a = 0;
  update(A), update(B);
}
inline void jia(int x, int y) {
  ti(x), ti(y);
  a[x].a = y;
}
void dfs(int x, int y) {
  for (auto i : c[x]) {
    if (i == y) continue;
    if (gg.count(make_pair(x, i)) || gg.count(make_pair(i, x)))
      a[i].a = x;
    else {
      a[++tt].a = x;
      a[i].a = tt;
      a[tt].key = 1, a[tt].id = tt, f[tt] = make_pair(x, i);
    }
    dfs(i, x);
  }
}
void Dfs(int x) {
  if (!x) return;
  Dfs(a[x].l);
  printf("%d\n", x);
  Dfs(a[x].ll);
}
inline void gao(int x) {
  splay(x);
  int A = a[x].id;
  int xx = f[A].first, y = f[A].second;
  printf("%d %d ", xx, y);
  del(A, xx, y);
}
int main() {
  scanf("%d", &n);
  tt = n;
  for (i = 1; i <= n - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    c[x].push_back(y);
    c[y].push_back(x);
    d.insert(make_pair(x, y));
    d.insert(make_pair(y, x));
  }
  for (i = 1; i <= n - 1; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    if (d.count(make_pair(x, y)) || d.count(make_pair(y, x))) {
      gg.insert(make_pair(x, y));
      gg.insert(make_pair(y, x));
    } else
      e[++t] = make_pair(x, y);
  }
  dfs(1, 0);
  printf("%d\n", t);
  for (i = 1; i <= t; i++) {
    int A = e[i].first, B = e[i].second;
    ti(A);
    access(B);
    gao(B);
    printf("%d %d\n", A, B);
    jia(A, B);
  }
  return 0;
}
