#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y;
} E[1500500], Q[1500500];
map<node, int> id;
int ans[1500500][4], c[1500500][2], fa[1500500], p[1500500], rev[1500500],
    mx[1500500], val[1500500], q[1500500];
int t, tot, n, m, u, v, cnt2;
int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
bool isroot(int x) { return ((c[fa[x]][1] != x) && (c[fa[x]][0] != x)); }
void down(int x) {
  int l = c[x][0], r = c[x][1];
  if (rev[x]) {
    rev[l] ^= 1;
    rev[r] ^= 1;
    rev[x] ^= 1;
    swap(c[x][0], c[x][1]);
  }
}
void up(int x) {
  int l = c[x][0], r = c[x][1];
  mx[x] = x;
  if (val[mx[l]] > val[mx[x]]) mx[x] = mx[l];
  if (val[mx[r]] > val[mx[x]]) mx[x] = mx[r];
}
int find(int x) {
  if (x == p[x]) return x;
  return p[x] = find(p[x]);
}
void rot(int &x) {
  int y = fa[x], z = fa[y], l, r;
  l = (c[y][1] == x);
  r = l ^ 1;
  if (!isroot(y)) c[z][c[z][1] == y] = x;
  fa[x] = z;
  fa[y] = x;
  fa[c[x][r]] = y;
  c[y][l] = c[x][r];
  c[x][r] = y;
  up(y);
  up(x);
}
void splay(int &x) {
  q[++tot] = x;
  for (int i = x; !isroot(i); i = fa[i]) q[++tot] = fa[i];
  while (tot) down(q[tot--]);
  while (!isroot(x)) {
    int y = fa[x], z = fa[y];
    if (!isroot(y)) {
      if ((x == c[y][1]) ^ (y == c[z][1]))
        rot(x);
      else
        rot(y);
    }
    rot(x);
  }
}
void access(int x) {
  for (int t = 0; x; t = x, x = fa[x]) {
    splay(x);
    c[x][1] = t;
    up(x);
  }
}
void makeroot(int x) {
  access(x);
  splay(x);
  rev[x] ^= 1;
}
void link(int x, int y) {
  makeroot(x);
  fa[x] = y;
}
void cut(int x, int y) {
  makeroot(x);
  access(y);
  splay(y);
  fa[x] = c[y][0] = 0;
  up(y);
}
int query(int x, int y) {
  makeroot(x);
  access(y);
  splay(y);
  return mx[y];
}
bool operator<(node a, node b) {
  if (a.x == b.x) return a.y < b.y;
  return a.x < b.x;
}
int main() {
  n = read();
  for (int i = 1; i <= n - 1; i++) {
    int x = read(), y = read();
    E[i].x = x, E[i].y = y;
    if (x > y) swap(x, y);
    id[(node){x, y}] = i;
    val[i + n] = 1;
  }
  for (int i = 1; i <= n - 1; i++) {
    int x = read(), y = read();
    Q[i].x = x;
    Q[i].y = y;
    if (x > y) swap(x, y);
    val[id[(node){x, y}] + n] = 0;
  }
  for (int i = 1; i <= n - 1; i++) {
    int x = E[i].x, y = E[i].y;
    link(x, i + n);
    link(y, i + n);
  }
  int cnt = 0;
  cnt2 = 2 * n - 1;
  for (int i = 1; i <= n - 1; i++) {
    int x = Q[i].x, y = Q[i].y;
    int t = query(x, y);
    if (val[t]) {
      ++cnt;
      ans[cnt][0] = E[t - n].x;
      ans[cnt][1] = E[t - n].y;
      ans[cnt][2] = x;
      ans[cnt][3] = y;
      ++cnt2;
      cut(E[t - n].x, t);
      cut(E[t - n].y, t);
      link(x, cnt2);
      link(y, cnt2);
    }
  }
  printf("%d\n", cnt);
  for (int i = 1; i <= cnt; i++)
    printf("%d %d %d %d\n", ans[i][0], ans[i][1], ans[i][2], ans[i][3]);
  return 0;
}
