#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline T rd() {
  T nmb = 0;
  int sgn = 0;
  char chr = getchar();
  while (!isdigit(chr)) {
    if (chr == '-') sgn = 1;
    chr = getchar();
  }
  while (isdigit(chr)) {
    nmb = (nmb << 3) + (nmb << 1) + chr - '0';
    chr = getchar();
  }
  return sgn ? -nmb : nmb;
}
template <typename T>
void wt(T nmb) {
  if (nmb > 9) wt(nmb / 10);
  putchar(nmb % 10 + '0');
}
template <typename T>
inline void cmax(T &x, T y) {
  x = x > y ? x : y;
}
template <typename T>
inline void cmin(T &x, T y) {
  x = x < y ? x : y;
}
inline void proc_status() {
  ifstream t("/proc/self/status");
  cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>())
       << endl;
}
const int N = 5e5 + 10;
int F[N], f[N];
int Get(int x) { return x == F[x] ? x : F[x] = Get(F[x]); }
int get(int x) { return x == f[x] ? x : f[x] = get(f[x]); }
vector<int> G[N], g[N];
map<pair<int, int>, int> vis;
int Fa[N];
void Init(int x, int ff) {
  Fa[x] = ff;
  for (int i = G[x].size() - 1; ~i; --i) {
    int k = G[x][i];
    if (k == ff) continue;
    Init(k, x);
  }
}
int fa[N];
void init(int x, int ff) {
  fa[x] = ff;
  for (int i = g[x].size() - 1; ~i; --i) {
    int k = g[x][i];
    if (k == ff) continue;
    init(k, x);
    if (vis[make_pair(x, k)]) {
      f[get(k)] = get(x);
      if (x == Fa[k])
        F[Get(k)] = Get(x);
      else
        F[Get(x)] = Get(k);
    }
  }
}
struct node {
  int a, b, c, d;
} ans[N];
int num;
void Dfs(int x, int ff) {
  for (int i = G[x].size() - 1; ~i; --i) {
    int k = G[x][i];
    if (k == ff) continue;
    Dfs(k, x);
    if (Get(k) ^ Get(x)) ans[++num] = (node){k, x, get(k), fa[get(k)]};
  }
}
int main() {
  int n = rd<int>();
  for (int i = 1; i < n; ++i) {
    int x = rd<int>(), y = rd<int>();
    G[x].push_back(y), G[y].push_back(x);
    vis[make_pair(x, y)] = vis[make_pair(y, x)] = 1;
  }
  Init(1, 0);
  for (int i = 1; i <= n; ++i) F[i] = f[i] = i;
  for (int i = 1; i < n; ++i) {
    int x = rd<int>(), y = rd<int>();
    g[x].push_back(y), g[y].push_back(x);
  }
  init(1, 0);
  Dfs(1, 0);
  printf("%d\n", num);
  for (int i = 1; i <= num; ++i)
    printf("%d %d %d %d\n", ans[i].a, ans[i].b, ans[i].c, ans[i].d);
  return 0;
}
