#include <bits/stdc++.h>
using namespace std;
vector<int> g[500020];
vector<pair<int, int> > need_to_rem[500020];
vector<int> c[500020];
map<pair<int, int>, bool> fx, fy;
map<pair<int, int>, bool> ffx;
vector<pair<pair<int, int>, pair<int, int> > > ans;
int pa[500020];
int sz[500020];
bool f[500020];
int Pa(int a) {
  if (a == pa[a]) return pa[a];
  pa[a] = Pa(pa[a]);
  return pa[a];
}
void uni(int a, int b) {
  a = Pa(a);
  b = Pa(b);
  if (sz[a] > sz[b]) swap(a, b);
  for (int i = 0; i < need_to_rem[a].size(); i++)
    need_to_rem[b].push_back(need_to_rem[a][i]);
  need_to_rem[a].clear();
  pa[a] = b;
  sz[b] += sz[a];
  sz[a] = 0;
}
void dfs(int p, int u) {
  bool era = 0;
  int paraa = 0;
  f[u] = 1;
  while (g[u].size()) {
    int to = g[u].back();
    g[u].pop_back();
    int x = u, y = to;
    if (x > y) swap(x, y);
    if (to == p) {
      paraa = to;
      if (ffx[make_pair(x, y)]) era = 1;
      continue;
    }
    if (!f[to]) dfs(u, to);
    if (!ffx[make_pair(x, y)]) {
      uni(u, to);
    }
  }
  if (era) {
    int P = Pa(u);
    while (true) {
      int x = need_to_rem[P].back().first;
      int y = need_to_rem[P].back().second;
      need_to_rem[P].pop_back();
      if (x > y) swap(x, y);
      if (fx[make_pair(x, y)]) {
        continue;
      }
      fx[make_pair(x, y)] = 1;
      if (Pa(u) == Pa(y)) swap(x, y);
      ans.push_back(make_pair(make_pair(paraa, u), make_pair(x, y)));
      uni(y, x);
      break;
    }
  }
}
inline void inp(int& n) {
  n = 0;
  int cx = getchar();
  while (cx < '0' || cx > '9') cx = getchar();
  while (cx >= '0' && cx <= '9')
    n = (n << 3) + (n << 1) + cx - '0', cx = getchar();
}
vector<pair<int, int> > rem, add;
int n, x, y, i, j;
int main() {
  scanf("%d", &n);
  for (i = 1; i < n; i++) {
    inp(x);
    inp(y);
    if (x > y) swap(x, y);
    g[x].push_back(y);
    g[y].push_back(x);
    fx[make_pair(x, y)] = 1;
  }
  for (j = 1; j < n; j++) {
    inp(x);
    inp(y);
    if (x > y) swap(x, y);
    c[x].push_back(y);
    c[y].push_back(x);
    fy[make_pair(x, y)] = 1;
  }
  for (i = 1; i <= n; i++) {
    sort(g[i].begin(), g[i].end());
    for (j = 0; j < g[i].size(); j++) {
      int to = g[i][j];
      if (to <= i) continue;
      if (!fy[make_pair(i, to)]) {
        ffx[make_pair(i, to)] = 1;
      }
    }
    sort(c[i].begin(), c[i].end());
    for (j = 0; j < c[i].size(); j++) {
      int to = c[i][j];
      if (to <= i) continue;
      if (!fx[make_pair(i, to)]) rem.push_back(make_pair(i, to));
    }
  }
  for (i = 0; i < rem.size(); i++) {
    need_to_rem[rem[i].first].push_back(rem[i]);
    need_to_rem[rem[i].second].push_back(rem[i]);
  }
  for (i = 1; i <= n; i++) pa[i] = i, sz[i] = need_to_rem[i].size();
  dfs(0, 1);
  ffx.clear();
  fx.clear();
  fy.clear();
  cout << ans.size() << endl;
  for (int i = 0; i < ans.size(); i++)
    printf("%d %d %d %d\n", ans[i].first.first, ans[i].first.second,
           ans[i].second.first, ans[i].second.second);
  ans.clear();
}
