#include <bits/stdc++.h>
using namespace std;
int n;
namespace LCT {
int fa[500005], ch[500005][2];
bool rev[500005], val[500005];
bool isr(int x) { return ch[fa[x]][0] != x && ch[fa[x]][1] != x; }
bool isc(int x) { return ch[fa[x]][1] == x; }
void upd(int x) { val[x] = val[ch[x][0]] | val[ch[x][1]] | (x > n); }
void pd(int x) {
  if (rev[x])
    swap(ch[x][0], ch[x][1]), rev[x] = 0, rev[ch[x][0]] ^= 1,
                              rev[ch[x][1]] ^= 1;
}
void pdpath(int x) {
  if (!isr(x)) pdpath(fa[x]);
  pd(x);
}
void rot(int x) {
  int y = fa[x], z = fa[y], c = isc(x);
  if (!isr(y)) ch[z][ch[z][1] == y] = x;
  fa[ch[y][c] = ch[x][!c]] = y;
  fa[ch[x][!c] = y] = x, fa[x] = z;
  upd(y);
}
void splay(int x) {
  for (pdpath(x); !isr(x); rot(x))
    if (!isr(fa[x])) rot(isc(fa[x]) == isc(x) ? fa[x] : x);
  upd(x);
}
void access(int x) {
  for (int y = 0; x; x = fa[y = x]) splay(x), ch[x][1] = y, upd(x);
}
void prefer(int x) { access(x), splay(x); }
void bert(int x) { prefer(x), rev[x] ^= 1; }
void link(int x, int y) { bert(x), fa[x] = y; }
void cut(int x, int y) { bert(x), prefer(y), fa[x] = ch[y][0] = 0, upd(y); }
int find(int x) {
  pd(x);
  if (val[ch[x][1]])
    return find(ch[x][1]);
  else
    return x > n ? x : find(ch[x][0]);
}
}  // namespace LCT
using LCT::cut;
using LCT::link;
vector<int> G[500005];
int X[500005], Y[500005], deg[500005], stk[500005], top, fa[500005];
void dfs(int u) {
  for (int i = G[u].size() - 1, v; i >= 0; i--)
    if ((v = G[u][i]) != fa[u]) fa[v] = u, dfs(v);
}
int main() {
  scanf("%d", &n);
  for (int i = 1, x, y; i < n; i++)
    scanf("%d%d", &x, &y), G[x].push_back(y), G[y].push_back(x);
  for (int i = 1; i < n; i++)
    scanf("%d%d", &X[i], &Y[i]), link(X[i], n + i), link(Y[i], n + i);
  dfs(1);
  for (int i = 1; i <= n; i++) deg[fa[i]]++;
  for (int i = 1; i <= n; i++)
    if (!deg[i]) stk[++top] = i;
  printf("%d\n", n - 1);
  for (int i = 1, k; i < n; i++) {
    int x = stk[i];
    if (!--deg[fa[x]]) stk[++top] = fa[x];
    LCT::bert(fa[x]), LCT::prefer(x);
    k = LCT::find(LCT::ch[x][0]) - n;
    printf("%d %d %d %d\n", x, fa[x], X[k], Y[k]);
    cut(X[k], n + k), cut(Y[k], n + k), link(x, fa[x]);
  }
}
