#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 250005;
struct DSU {
  vector<int> p;
  DSU(int n = 1) : p(n) { iota(p.begin(), p.end(), 0); }
  int rep(int u) { return u == p[u] ? u : p[u] = rep(p[u]); }
  void join(int u, int v) { p[rep(u)] = rep(v); }
};
int sz[N];
vector<int> g[N];
int p[N], in[N], rin[N], out[N], t = 1, nxt[N];
void dfs_sz(int u) {
  sz[u] = 1;
  for (auto &v : g[u])
    if (v == p[u]) {
      swap(v, g[u].back());
      g[u].pop_back();
      break;
    }
  for (auto &v : g[u]) {
    p[v] = u;
    dfs_sz(v);
    sz[u] += sz[v];
    if (sz[v] > sz[g[u][0]]) swap(v, g[u][0]);
  }
}
void dfs_hld(int u) {
  in[u] = t++;
  rin[in[u]] = u;
  for (auto v : g[u]) {
    nxt[v] = (v == g[u][0] ? nxt[u] : v);
    dfs_hld(v);
  }
  out[u] = t;
}
DSU nx, pv;
int n;
void get(int u, int v) {
  int c = u, d = v;
  bool found = false;
  int ansc = -1, ansd = -1;
  while (nxt[c] != nxt[d]) {
    if (in[nxt[c]] > in[nxt[d]]) {
      int l = rin[pv.rep(in[c])];
      if (in[l] >= in[nxt[c]]) {
        found = true;
        ansc = l, ansd = p[l];
        pv.join(in[l], in[p[l]]);
        if (g[l].empty())
          nx.join(in[l], n + 1);
        else
          nx.join(in[l], in[g[l][0]]);
        break;
      }
      c = p[nxt[c]];
    } else {
      int l = rin[nx.rep(in[nxt[d]])];
      if (in[l] <= in[d]) {
        ansc = l, ansd = p[l];
      }
      d = p[nxt[d]];
    }
  }
  if (!found) {
    if (in[c] < in[d]) {
      int l = rin[nx.rep(in[c] + 1)];
      if (in[l] <= in[d]) {
        found = true;
        ansc = l, ansd = p[l];
        pv.join(in[l], in[p[l]]);
        if (g[l].empty())
          nx.join(in[l], n + 1);
        else
          nx.join(in[l], in[g[l][0]]);
      }
    } else {
      int l = rin[pv.rep(in[c])];
      if (in[l] > in[d]) {
        ansc = l, ansd = p[l];
      }
    }
  }
  if (!found) {
    pv.join(in[ansc], in[p[ansc]]);
    if (g[ansc].empty())
      nx.join(in[ansc], n + 1);
    else
      nx.join(in[ansc], in[g[ansc][0]]);
  }
  printf("%d %d %d %d\n", ansc, ansd, u, v);
}
vector<int> t2[N];
void solve(int u, int par) {
  for (int v : t2[u])
    if (v != par) {
      solve(v, u);
    }
  if (par != u) {
    get(u, par);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  p[1] = 1;
  dfs_sz(1);
  nxt[1] = 1;
  dfs_hld(1);
  rin[0] = 0, rin[n + 1] = n + 1;
  in[0] = 0, in[n + 1] = n + 1;
  nx = DSU(n + 2);
  pv = DSU(n + 2);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    t2[u].push_back(v);
    t2[v].push_back(u);
  }
  printf("%d\n", n - 1);
  solve(1, 1);
}
