#include <bits/stdc++.h>
using namespace std;
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = -1;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  return x * f;
}
const int MAXN = 500010;
const int INF = 1e9;
int N;
int dep[MAXN + 1];
int fa[20][MAXN + 1];
int Root[MAXN << 1], Next[MAXN << 1], Node[MAXN << 1], cnt;
inline void insert(int u, int v) {
  Node[++cnt] = v;
  Next[cnt] = Root[u];
  Root[u] = cnt;
}
int fat[MAXN + 1];
inline int find(int x) { return (x == fat[x] ? x : (fat[x] = find(fat[x]))); }
int up[MAXN + 1], DEP[MAXN + 1], Idx[MAXN + 1];
vector<int> vec[MAXN + 1];
inline void merge(int u, int v) {
  assert(find(u) != find(v));
  fat[find(v)] = find(u);
}
inline int LCA(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = 19; i >= 0; i--)
    if (dep[u] - dep[v] >= (1 << i)) u = fa[i][u];
  for (int i = 19; i >= 0; i--)
    if (fa[i][u] != fa[i][v]) u = fa[i][u], v = fa[i][v];
  if (u != v) return fa[0][u];
  return u;
}
inline void dfs2(int k, int Fa) {
  dep[k] = dep[Fa] + 1;
  fa[0][k] = Fa;
  for (int j = 1; j <= 19; j++) fa[j][k] = fa[j - 1][fa[j - 1][k]];
  for (int x = Root[k]; x; x = Next[x]) {
    int v = Node[x];
    if (v == Fa) continue;
    dfs2(v, k);
  }
  return;
}
inline int Jump(int v, int u) {
  for (int i = 19; i >= 0; i--) {
    if (dep[find(fa[i][v])] > dep[find(u)] && find(fa[i][v]) != find(u))
      v = fa[i][v];
  }
  int k = find(v);
  merge(u, v);
  return k;
}
bool in[MAXN + 1];
int deg[MAXN + 1];
queue<int> que;
int main() {
  N = read();
  for (int i = 1; i < N; i++) {
    int u = read(), v = read();
    insert(u, v);
    insert(v, u);
  }
  for (int i = 1; i < N; i++) {
    int u = read(), v = read();
    ++deg[u];
    ++deg[v];
    vec[u].push_back(v);
    vec[v].push_back(u);
  }
  dfs2(1, 0);
  for (int i = 1; i <= N; i++) fat[i] = i;
  Idx[1] = 0;
  printf("%d\n", N - 1);
  for (int i = 1; i <= N; i++)
    if (deg[i] == 1) que.push(i);
  while (que.size() > 1) {
    int k = que.front();
    que.pop();
    in[k] = 1;
    int fd = -1;
    for (int i = 0, sz = vec[k].size(); i < sz; i++) {
      int v = vec[k][i];
      if (in[v]) continue;
      fd = v;
      --deg[v];
      if (deg[v] == 1) que.push(v);
      break;
    }
    assert(fd != -1);
    int u = k, v = fd;
    int lca = LCA(u, v);
    int y;
    if (dep[lca] < dep[find(u)]) {
      y = find(u);
      if (fa[0][y]) merge(fa[0][y], y);
    } else
      y = Jump(v, u);
    printf("%d %d %d %d\n", fa[0][y], y, k, fd);
  }
  return 0;
}
