#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) f = ch == '-' ? -1 : f, ch = getchar();
  while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
  return x * f;
}
int buf[30];
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  for (; x; x /= 10) buf[++buf[0]] = x % 10;
  if (!buf[0]) buf[++buf[0]] = 0;
  for (; buf[0]; putchar('0' + buf[buf[0]--]))
    ;
}
const int N = 500005;
const int E = N << 1;
int fa[N], a[N], b[N], que[N], last[N];
int tov[E], nxt[E], id[E];
bool vis[N];
pair<int, int> e[2][N];
int n, tot, head, tail, m;
inline void insert(int x, int y, int z) {
  tov[++tot] = y, id[tot] = z, nxt[tot] = last[x], last[x] = tot;
}
int getfather(int son) {
  return fa[son] == son ? son : fa[son] = getfather(fa[son]);
}
inline void merge(int x, int y) {
  x = getfather(x), y = getfather(y);
  if (x == y) return;
  if (x > y) swap(x, y);
  fa[y] = x;
}
void bfs(int *e) {
  for (int i = 1; i <= n; ++i) vis[i] = 0;
  for (que[head = 0, tail = 1] = 1; head < tail;) {
    int x = que[++head];
    vis[x] = 1;
    for (int i = last[x], y; i; i = nxt[i])
      if (!vis[y = tov[i]]) e[que[++tail] = y] = id[i];
  }
}
void clearedge() {
  for (; tot; tov[tot] = nxt[tot] = 0, --tot)
    ;
  for (int i = 1; i <= n; ++i) last[i] = 0;
}
int main() {
  n = read();
  for (int i = 1, x, y; i < n; ++i)
    x = read(), y = read(), e[0][i] = make_pair(min(x, y), max(x, y));
  sort(e[0] + 1, e[0] + n);
  for (int i = 1, x, y; i < n; ++i)
    x = read(), y = read(), e[1][i] = make_pair(min(x, y), max(x, y));
  sort(e[1] + 1, e[1] + n);
  for (int i = 1; i <= n; ++i) fa[i] = i;
  for (int i = 1, ptr = 1; i < n; ++i) {
    for (; ptr < n && e[1][ptr] < e[0][i]; ++ptr)
      ;
    if (ptr < n && e[0][i] == e[1][ptr]) merge(e[0][i].first, e[0][i].second);
  }
  for (int i = 1, x, y; i < n; ++i) {
    x = getfather(e[0][i].first), y = getfather(e[0][i].second);
    if (x != y) insert(x, y, i), insert(y, x, i);
  }
  bfs(a), clearedge();
  for (int i = 1, x, y; i < n; ++i) {
    x = getfather(e[1][i].first), y = getfather(e[1][i].second);
    if (x != y) ++m, insert(x, y, i), insert(y, x, i);
  }
  bfs(b);
  write(m), putchar('\n');
  for (head = 1; head <= tail; ++head) {
    int x = que[head];
    if (a[x] && b[x])
      write(e[0][a[x]].first), putchar(' '), write(e[0][a[x]].second),
          putchar(' '), write(e[1][b[x]].first), putchar(' '),
          write(e[1][b[x]].second), putchar('\n');
  }
  return 0;
}
