#include <bits/stdc++.h>
using namespace std;
vector<int> g[2][250010];
int dep[2][250010], fa[2][250010], st[250010][18], s[2][250010], e[2][250010];
int n;
vector<int> edg[2];
void dfs(int id, int np, int fath) {
  fa[id][np] = fath;
  dep[id][np] = dep[id][fath] + 1;
  for (auto &x : g[id][np]) {
    if (x == fath) continue;
    dfs(id, x, np);
  }
}
inline int lca(int x, int y) {
  if (dep[0][x] < dep[0][y]) swap(x, y);
  for (int i = 17; i >= 0; i--)
    if (dep[0][st[x][i]] >= dep[0][y]) x = st[x][i];
  if (x == y) return x;
  for (int i = 17; i >= 0; i--)
    if (st[x][i] != st[y][i]) x = st[x][i], y = st[y][i];
  return st[x][0];
}
class dsu {
 public:
  int fa[250010];
  inline void init(int N) {
    for (int i = 1; i <= N; i++) fa[i] = i;
  }
  inline int getf(int x) { return x == fa[x] ? x : fa[x] = getf(fa[x]); }
  inline void merge(int x, int y) {
    x = getf(x);
    y = getf(y);
    if (x ^ y) fa[x] = y;
  }
} D;
inline int cmp(int x, int y) { return dep[1][s[1][x]] > dep[1][s[1][y]]; }
int main() {
  scanf("%d", &n);
  for (int T = 0; T < 2; T++) {
    edg[T].resize(n - 1);
    for (int i = 1, ti, tj; i < n; i++) {
      scanf("%d%d", &ti, &tj);
      s[T][i] = ti;
      e[T][i] = tj;
      edg[T][i - 1] = i;
      g[T][ti].push_back(tj);
      g[T][tj].push_back(ti);
    }
    dfs(T, 1, 0);
  }
  for (int i = 1; i <= n; i++) st[i][0] = fa[0][i];
  for (int j = 1; j < 18; j++)
    for (int i = 1; i <= n; i++) st[i][j] = st[st[i][j - 1]][j - 1];
  printf("%d\n", n - 1);
  for (int i = 1; i < n; i++) {
    if (dep[1][s[1][i]] > dep[1][e[1][i]]) swap(s[1][i], e[1][i]);
  }
  D.init(n);
  sort(edg[1].begin(), edg[1].end(), cmp);
  for (auto &x : edg[1]) {
    int S = s[1][x], E = e[1][x];
    int leafbel = D.getf(E);
    int L = lca(S, E);
    int ans = -1;
    if (D.getf(L) == leafbel) {
      ans = S;
      for (int i = 17; i >= 0; i--)
        if (dep[0][st[ans][i]] > dep[0][L] && D.getf(st[ans][i]) != leafbel)
          ans = st[ans][i];
    } else {
      ans = E;
      for (int i = 17; i >= 0; i--)
        if (dep[0][st[ans][i]] > dep[0][L] && D.getf(st[ans][i]) == leafbel)
          ans = st[ans][i];
    }
    printf("%d %d %d %d\n", ans, st[ans][0], S, E);
    if (D.getf(ans) != leafbel)
      D.merge(ans, E);
    else
      D.merge(st[ans][0], E);
  }
  return 0;
}
