#include <bits/stdc++.h>
using namespace std;
const int N = 250005;
int n, m, lg[N], dep[N], dp[N][20], deg[N], f[N], vis[N];
queue<int> q;
vector<int> v[N], t[N];
void dfs(int pos, int fa, int dd) {
  dep[pos] = dd;
  dp[pos][0] = fa;
  for (int i = 1; i <= lg[dep[pos]]; i++)
    dp[pos][i] = dp[dp[pos][i - 1]][i - 1];
  for (auto &i : v[pos])
    if (i != fa) dfs(i, pos, dd + 1);
}
int query(int x, int y) {
  if (dep[x] > dep[y]) swap(x, y);
  int tt = dep[y] - dep[x];
  for (int i = 0; i <= lg[tt]; i++)
    if (tt & (1 << i)) y = dp[y][i];
  if (x == y) return x;
  for (int i = 19; i >= 0; --i)
    if (dp[x][i] != dp[y][i]) x = dp[x][i], y = dp[y][i];
  return dp[x][0];
}
int getf(int v) { return f[v] == v ? v : f[v] = getf(f[v]); }
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  int t1, t2;
  for (int i = 1; i < n; i++)
    cin >> t1 >> t2, v[t1].push_back(t2), v[t2].push_back(t1);
  for (int i = 1; i < n; i++)
    cin >> t1 >> t2, t[t1].push_back(t2), t[t2].push_back(t1), ++deg[t1],
        ++deg[t2];
  f[1] = 1;
  for (int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1, f[i] = i;
  dfs(1, 0, 1);
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) q.push(i);
  cout << n - 1 << endl;
  while (q.size() > 1) {
    int nd = q.front(), n2 = 0;
    q.pop();
    vis[nd] = 1;
    for (auto &i : t[nd])
      if (!vis[i]) {
        n2 = i;
        if (--deg[i] == 1) q.push(i);
        break;
      }
    int lca = query(nd, n2), a = getf(nd), b = -1;
    if (dep[a] > dep[lca]) {
      b = dp[a][0];
      cout << a << ' ' << b << ' ' << nd << ' ' << n2 << endl;
      f[a] = getf(b);
    } else {
      b = n2;
      for (int i = 19; i >= 0; --i)
        if (dep[dp[b][i]] > dep[lca] && getf(dp[b][i]) != a) b = dp[b][i];
      cout << b << ' ' << dp[b][0] << ' ' << nd << ' ' << n2 << endl;
      f[b] = a;
    }
  }
  return 0;
}
