#include <bits/stdc++.h>
using namespace std;
namespace SETS {
int fa[300005];
void init(int n) {
  for (int i = 1; i <= n; i++) fa[i] = i;
}
int find_father(int x) { return (fa[x] == x) ? x : fa[x] = find_father(fa[x]); }
bool check(int x, int y) {
  x = find_father(x);
  y = find_father(y);
  return x != y;
}
void merge(int x, int y) {
  x = find_father(x);
  y = find_father(y);
  if (x == y) return;
  fa[x] = y;
}
}  // namespace SETS
vector<int> e1[300005], e2[300005];
int id[300005], fa1[300005], dfs_cnt;
int fa2[300005][20], dep[300005];
void dfs1(int x) {
  id[++dfs_cnt] = x;
  for (int i = 0; i < e1[x].size(); i++)
    if (e1[x][i] != fa1[x]) {
      int u = e1[x][i];
      fa1[u] = x;
      dfs1(u);
    }
}
void dfs2(int x) {
  for (int i = 0; i < e2[x].size(); i++)
    if (e2[x][i] != fa2[x][0]) {
      int u = e2[x][i];
      dep[u] = dep[x] + 1;
      fa2[u][0] = x;
      for (int j = 1; j < 20; j++) fa2[u][j] = fa2[fa2[u][j - 1]][j - 1];
      dfs2(u);
    }
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  int d = dep[x] - dep[y];
  for (int i = 0; i < 20; i++)
    if ((d >> i) & 1) x = fa2[x][i];
  if (x == y) return x;
  for (int i = 19; i >= 0; i--)
    if (fa2[x][i] != fa2[y][i]) {
      x = fa2[x][i];
      y = fa2[y][i];
    }
  return fa2[x][0];
}
int jump(int x, int v, int d) {
  for (int i = 19; i >= 0; i--)
    if (fa2[x][i] && dep[fa2[x][i]] >= d && SETS::find_father(fa2[x][i]) != v)
      x = fa2[x][i];
  return x;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e2[x].push_back(y);
    e2[y].push_back(x);
  }
  dfs2(1);
  for (int i = 1; i < n; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    e1[x].push_back(y);
    e1[y].push_back(x);
  }
  dfs1(1);
  printf("%d\n", n - 1);
  SETS::init(n);
  for (int i = n; i > 1; i--) {
    int x = id[i], y = fa1[x];
    int p = lca(x, y);
    if (SETS::check(x, p)) {
      int u = SETS::find_father(x);
      SETS::merge(u, fa2[u][0]);
      printf("%d %d %d %d\n", u, fa2[u][0], x, y);
    } else {
      int u = jump(y, SETS::find_father(x), dep[p]);
      SETS::merge(u, fa2[u][0]);
      printf("%d %d %d %d\n", u, fa2[u][0], x, y);
    }
  }
  return 0;
}
