#include <bits/stdc++.h>
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
char nc() { return getchar(); }
int read() {
  int x = 0, y = 1;
  char c = nc();
  while (!isdigit(c)) {
    if (c == '-') y = -1;
    c = nc();
  }
  while (isdigit(c)) {
    x = (x << 1) + (x << 3) + (c ^ 48);
    c = nc();
  }
  return x * y;
}
int n;
struct tree {
  int head[250005], cnt, deg[250005];
  struct edge {
    int next, to;
  } a[250005 << 1];
  void add(int x, int y) {
    a[++cnt].next = head[x];
    a[cnt].to = y;
    head[x] = cnt;
    deg[y]++;
  }
  int fa[250005][18], dep[250005], bin[19];
  void dfs(int x, int f, int d) {
    fa[x][0] = f;
    dep[x] = d;
    for (int i = head[x]; i; i = a[i].next) {
      int t = a[i].to;
      if (t == f) continue;
      dfs(t, x, d + 1);
    }
  }
  void ST() {
    bin[0] = 1;
    for (int i = 1; i <= 18; i++) bin[i] = bin[i - 1] << 1;
    for (int j = 1; bin[j] <= n; j++)
      for (int i = 1; i <= n; i++)
        if (fa[i][j - 1]) fa[i][j] = fa[fa[i][j - 1]][j - 1];
  }
  int getlca(int x, int y) {
    if (dep[x] < dep[y]) swap(x, y);
    int t = dep[x] - dep[y];
    for (int i = 0; bin[i] <= t; i++)
      if (t & bin[i]) x = fa[x][i];
    if (x == y) return x;
    for (int i = 17; i >= 0; i--)
      if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
    return fa[x][0];
  }
};
tree t1, t2;
queue<int> q;
int vst[250005], prt[250005];
int findprt(int x) { return x == prt[x] ? x : prt[x] = findprt(prt[x]); }
void merge(int x, int y) {
  int u = findprt(x), v, lca = t1.getlca(x, y);
  if (t1.dep[u] > t1.dep[lca])
    printf("%d %d %d %d\n", u, t1.fa[u][0], x, y), prt[u] = t1.fa[u][0];
  else {
    v = y;
    for (int i = 17; i >= 0; i--)
      if (t1.dep[t1.fa[v][i]] > t1.dep[lca] && findprt(t1.fa[v][i]) != u)
        v = t1.fa[v][i];
    printf("%d %d %d %d\n", v, t1.fa[v][0], x, y), prt[v] = t1.fa[v][0];
  }
}
int main() {
  n = read();
  int x, y;
  for (int i = 1; i < n; i++)
    x = read(), y = read(), t1.add(x, y), t1.add(y, x);
  for (int i = 1; i < n; i++)
    x = read(), y = read(), t2.add(x, y), t2.add(y, x);
  t1.dfs(1, 0, 1);
  t1.ST();
  for (int i = 1; i <= n; i++)
    if (t2.deg[i] == 1) q.push(i);
  for (int i = 1; i <= n; i++) prt[i] = i;
  printf("%d\n", n - 1);
  while (!q.empty()) {
    x = q.front();
    q.pop();
    if (vst[x]) continue;
    vst[x] = 1;
    for (int i = t2.head[x]; i; i = t2.a[i].next) {
      int t = t2.a[i].to;
      if (vst[t]) continue;
      t2.deg[t]--;
      if (t2.deg[t] <= 1) q.push(t);
      merge(x, t);
    }
  }
  return 0;
}
