#include <bits/stdc++.h>
const int N = 5e5 + 10;
const int MAXN = 1e9;
const long long MOD = 1e9 + 7;
using namespace std;
int cnt0 = 0;
int n;
int fa[N];
int father[N];
int cnt;
struct Edge {
  int u, v;
  Edge(int U = 0, int V = 0) {
    if (U > V) swap(U, V);
    u = U, v = V;
  }
  bool operator<(Edge A) const { return ((u < A.u) || (u == A.u && v < A.v)); }
};
struct Node {
  Edge l;
  int pre;
} edg[N * 2];
int last[N], first[N], n0 = 0;
void add_edge(int p, Edge L) {
  n0++;
  if (last[p] == 0) first[p] = n0;
  edg[n0].pre = last[p];
  edg[n0].l = L;
  last[p] = n0;
}
int kk;
char cc;
int read() {
  while ((cc = getchar()) == ' ' || cc == '\n')
    ;
  kk = (cc - '0');
  while ((cc = getchar()) != ' ' && cc != '\n')
    kk = (kk << 1) + (kk << 3) + (cc - '0');
  return kk;
}
map<Edge, int> use;
vector<int> f1[N], f2[N];
void init() {
  int u, v;
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    u = read(), v = read();
    use[Edge(u, v)] = 1;
    f1[u].push_back(v);
    f1[v].push_back(u);
  }
  for (int i = 1; i < n; i++) {
    u = read(), v = read();
    if (use[Edge(u, v)] == 1)
      use[Edge(u, v)] = 3;
    else
      use[Edge(u, v)] = 2, cnt++;
    f2[u].push_back(v);
    f2[v].push_back(u);
  }
  for (int i = 1; i <= n; i++) father[i] = i, last[i] = 0;
}
int getfather(int x) {
  return x == father[x] ? x : father[x] = getfather(father[x]);
}
void dfs_1(int u) {
  int v, fu, fv;
  for (int i = 0; i < f1[u].size(); i++)
    if (fa[u] != f1[u][i]) {
      v = f1[u][i];
      if (use[Edge(u, v)] == 3) father[v] = getfather(u);
      fa[v] = u;
      dfs_1(v);
    }
  for (int i = 0; i < f2[u].size(); i++)
    if (use[Edge(u, f2[u][i])] == 2) {
      add_edge(father[u], Edge(u, f2[u][i]));
    }
}
void dfs_2(int u) {
  int v, u1, v1, fv1;
  for (int i = 0; i < f1[u].size(); i++)
    if (fa[u] != f1[u][i]) {
      dfs_2(f1[u][i]);
    }
  if (father[u] == u && u != 1) {
    for (int i = last[u]; i; i = edg[i].pre)
      if (use[edg[i].l] == 2) {
        use[edg[i].l] = 3;
        u1 = edg[i].l.u, v1 = edg[i].l.v;
        if (getfather(u1) != u) swap(u1, v1);
        fv1 = getfather(v1);
        father[u] = fv1;
        last[u] = edg[i].pre;
        if (last[u] > 0) {
          edg[first[fv1]].pre = last[u];
          first[fv1] = first[u];
        }
        printf("%d %d %d %d\n", u, fa[u], u1, v1);
        break;
      }
  }
}
void work() {
  printf("%d\n", cnt);
  dfs_1(1);
  dfs_2(1);
}
int main() {
  init();
  work();
  return 0;
}
