#include <bits/stdc++.h>
using namespace std;
int read() {
  int s = 0, f = 1;
  char ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9')
    s = (s << 3) + (s << 1) + ch - '0', ch = getchar();
  return f * s;
}
struct node {
  int fa, son[2];
  bool rev;
} t[250010];
void pushdown(int x) {
  if (t[x].rev)
    swap(t[x].son[0], t[x].son[1]), t[t[x].son[0]].rev ^= 1,
        t[t[x].son[1]].rev ^= 1, t[x].rev = 0;
}
void push(int x) {
  if ((t[t[x].fa].son[0] == x || t[t[x].fa].son[1] == x)) push(t[x].fa);
  pushdown(x);
}
void rotate(int x) {
  int f = t[x].fa, gf = t[f].fa;
  int k = t[f].son[1] == x, p = k ^ 1;
  if ((t[t[f].fa].son[0] == f || t[t[f].fa].son[1] == f))
    t[gf].son[t[gf].son[1] == f] = x;
  if (t[x].son[p]) t[t[x].son[p]].fa = f;
  t[f].son[k] = t[x].son[p];
  t[x].son[p] = f;
  t[f].fa = x;
  t[x].fa = gf;
}
void splay(int x) {
  push(x);
  while ((t[t[x].fa].son[0] == x || t[t[x].fa].son[1] == x)) {
    int f = t[x].fa, gf = t[f].fa;
    if ((t[t[f].fa].son[0] == f || t[t[f].fa].son[1] == f))
      rotate((t[f].son[1] == x) ^ (t[gf].son[1] == f) ? x : f);
    rotate(x);
  }
}
void access(int x) {
  int y = 0;
  do {
    splay(x);
    t[x].son[1] = y;
    y = x;
    x = t[x].fa;
  } while (x);
}
void makeroot(int x) {
  access(x);
  splay(x);
  t[x].rev = 1;
}
int findroot(int x) {
  access(x);
  splay(x);
  while (t[x].son[0]) x = t[x].son[0];
  return x;
}
void link(int x, int y) {
  makeroot(x);
  t[x].fa = y;
}
void cut(int x, int y) {
  makeroot(x);
  access(y);
  splay(y);
  t[y].son[0] = t[x].fa = 0;
}
int f[250010], n;
int find(int x) { return f[x] == x ? x : f[x] = find(f[x]); }
void merge(int x, int y) { x = find(x), y = find(y), f[x] = y; }
int get(int x, int y) {
  makeroot(x);
  access(y);
  splay(y);
  int lst, pre, cur;
  while (y) {
    lst = y;
    push(lst);
    if (find(x) == find(y))
      pre = y, y = t[y].son[1];
    else
      cur = y, y = t[y].son[0];
  }
  splay(lst);
  printf("%d %d\n", pre, cur);
  return cur;
}
struct edge {
  int to, lt;
} e[250010 << 1];
int in[250010], cnt, tot, a[250010], b[250010];
void add(int x, int y) {
  e[++cnt].to = y;
  e[cnt].lt = in[x];
  in[x] = cnt;
  e[++cnt].to = x;
  e[cnt].lt = in[y];
  in[y] = cnt;
}
void dfs(int x, int fr) {
  for (int i = in[x]; i; i = e[i].lt) {
    int y = e[i].to;
    if (y == fr) continue;
    dfs(y, x);
    a[++tot] = y, b[tot] = x;
  }
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) f[i] = i;
  int x, y;
  for (int i = 1; i < n; i++) add(read(), read());
  dfs(1, 0);
  for (int i = 1; i < n; i++) link(read(), read());
  printf("%d\n", n - 1);
  for (int i = 1; i < n; i++) {
    printf("%d %d ", a[i], b[i]);
    cut(a[i], get(a[i], b[i]));
    link(a[i], b[i]);
    merge(a[i], b[i]);
  }
  return 0;
}
