#include <bits/stdc++.h>
using namespace std;
template <class T>
T gi() {
  T x = 0;
  bool f = 0;
  char c = getchar();
  while (c != '-' && (c < '0' || c > '9')) c = getchar();
  if (c == '-') f = 1, c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  return f ? -x : x;
}
const int N = 500010;
map<pair<int, int>, bool> M;
struct node {
  int to, nxt;
} g[N << 1];
struct edge {
  int x, y;
} e[N];
int lst[N], gl, n, fa[N];
void add(int x, int y) {
  g[++gl] = (node){y, lst[x]};
  lst[x] = gl;
}
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
struct table {
  int id, nxt;
} a[N << 1];
int tail[N], head[N], tot;
void Add(int x, int y, int id) {
  a[++tot] = (table){id, tail[x]};
  tail[x] = tot;
  if (!head[x]) head[x] = tot;
}
void merge(int x, int y) {
  fa[x] = y;
  a[head[y]].nxt = tail[x];
  head[y] = head[x];
}
void dfs(int u, int ff) {
  for (int i = lst[u]; i; i = g[i].nxt)
    if (g[i].to != ff) dfs(g[i].to, u);
  if (u == 1 || find(u) == find(ff)) return;
  int x = tail[find(u)], y;
  while (x && find(e[a[x].id].x) == find(e[a[x].id].y))
    tail[find(u)] = x = a[x].nxt;
  printf("%d %d %d %d\n", ff, u, e[a[x].id].x, e[a[x].id].y);
  y = find(e[a[x].id].y);
  x = find(e[a[x].id].x);
  merge(x, y);
  return;
}
int main() {
  n = gi<long long>();
  for (int i = 1; i < n; i++) {
    int x = gi<long long>(), y = gi<long long>();
    if (x > y) swap(x, y);
    M[make_pair(x, y)] = 1;
    add(x, y);
    add(y, x);
  }
  for (int i = 1; i <= n; i++) fa[i] = i;
  int m = 0;
  for (int i = 1; i < n; i++) {
    int x = gi<long long>(), y = gi<long long>();
    if (x > y) swap(x, y);
    if (M.find(make_pair(x, y)) == M.end())
      e[++m] = (edge){x, y};
    else
      fa[find(y)] = find(x);
  }
  printf("%d\n", m);
  for (int i = 1; i <= m; i++)
    Add(find(e[i].x), find(e[i].y), i), Add(find(e[i].y), find(e[i].x), i);
  dfs(1, 0);
  return 0;
}
