#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > allModify;
class Polygon {
 private:
  int n;
  vector<int> label;
  vector<set<int> > adj;
  void splitPolygon(Polygon &a, Polygon &b, int x, int y) const {
    if (x > y) return (splitPolygon(a, b, y, x));
    for (int i = (x), _b = (y); i <= _b; i = i + 1) a.label.push_back(label[i]);
    for (int i = (0), _b = (x); i <= _b; i = i + 1) b.label.push_back(label[i]);
    for (int i = (y), _b = (n - 1); i <= _b; i = i + 1)
      b.label.push_back(label[i]);
    a.n = a.label.size();
    b.n = b.label.size();
    a.adj.assign(a.n, set<int>());
    b.adj.assign(b.n, set<int>());
    for (int i = 0, _n = (n); i < _n; i = i + 1)
      for (__typeof((adj[i]).begin()) it = (adj[i]).begin();
           it != (adj[i]).end(); it++) {
        int j = *it;
        Polygon &cur = (x <= i && i <= y && x <= j && j <= y) ? a : b;
        int idi = lower_bound(cur.label.begin(), cur.label.end(), label[i]) -
                  cur.label.begin();
        int idj = lower_bound(cur.label.begin(), cur.label.end(), label[j]) -
                  cur.label.begin();
        cur.adj[idi].insert(idj);
        cur.adj[idj].insert(idi);
      }
    int idx, idy;
    idx =
        lower_bound(a.label.begin(), a.label.end(), label[x]) - a.label.begin();
    idy =
        lower_bound(a.label.begin(), a.label.end(), label[y]) - a.label.begin();
    a.adj[idx].insert(idy);
    a.adj[idy].insert(idx);
    idx =
        lower_bound(b.label.begin(), b.label.end(), label[x]) - b.label.begin();
    idy =
        lower_bound(b.label.begin(), b.label.end(), label[y]) - b.label.begin();
    b.adj[idx].insert(idy);
    b.adj[idy].insert(idx);
  }
  int prevInSet(const set<int> &s, set<int>::iterator it) const {
    if (it == s.begin()) it = s.end();
    it--;
    return (*it);
  }
  int nextInSet(const set<int> &s, set<int>::iterator it) const {
    it++;
    if (it == s.end()) it = s.begin();
    return (*it);
  }
  bool haveEdge(int i, int j) const { return (adj[i].find(j) != adj[i].end()); }
  pair<int, int> tryChange(int i, set<int>::iterator it) const {
    int x = prevInSet(adj[i], it);
    int y = nextInSet(adj[i], it);
    return (make_pair(x, y));
  }
  void fixChange(int u, int v, int x, int y) {
    adj[u].erase(v);
    adj[v].erase(u);
    adj[x].insert(y);
    adj[y].insert(x);
    allModify.push_back(make_pair(label[u], label[v]));
  }
  void debug(void) const {
    printf("POLYGON of %d\n", n);
    printf("LABEL: ");
    for (int i = 0, _n = (n); i < _n; i = i + 1) printf("%d ", label[i]);
    printf("\n");
    for (int i = 0, _n = (n); i < _n; i = i + 1) {
      printf("adj of %d: ", i);
      for (__typeof((adj[i]).begin()) it = (adj[i]).begin();
           it != (adj[i]).end(); it++)
        printf("%d ", *it);
      printf("\n");
    }
    printf("___END___\n");
  }

 public:
  Polygon() { n = 0; }
  Polygon(int n) {
    this->n = n;
    for (int i = 0, _n = (n); i < _n; i = i + 1) label.push_back(i + 1);
    adj.assign(n, set<int>());
    for (int i = 0, _n = (n); i < _n; i = i + 1) {
      adj[i].insert((i + 1 + n) % n);
      adj[i].insert((i - 1 + n) % n);
    }
  }
  void input(void) {
    for (int love = 0, _n = (n - 3); love < _n; love = love + 1) {
      int x, y;
      scanf("%d%d", &x, &y);
      x--;
      y--;
      adj[x].insert(y);
      adj[y].insert(x);
    }
  }
  void modify(const Polygon &goal) {
    if (n < 4) return;
    for (int i = 0, _n = (n); i < _n; i = i + 1)
      for (__typeof((adj[i]).begin()) it = (adj[i]).begin();
           it != (adj[i]).end(); it++)
        if (*it != (i + 1) % n && *it != (i - 1 + n) % n &&
            goal.haveEdge(i, *it)) {
          int j = *it;
          Polygon A, B, goalA, goalB;
          splitPolygon(A, B, i, j);
          goal.splitPolygon(goalA, goalB, i, j);
          A.modify(goalA);
          B.modify(goalB);
          return;
        }
    for (int i = 0, _n = (n); i < _n; i = i + 1)
      for (__typeof((adj[i]).begin()) it = (adj[i]).begin();
           it != (adj[i]).end(); it++)
        if (*it != (i + 1) % n && *it != (i - 1 + n) % n) {
          pair<int, int> tmp = tryChange(i, it);
          if (goal.haveEdge(tmp.first, tmp.second)) {
            int j = *it;
            fixChange(i, j, tmp.first, tmp.second);
            Polygon A, B, goalA, goalB;
            splitPolygon(A, B, tmp.first, tmp.second);
            goal.splitPolygon(goalA, goalB, tmp.first, tmp.second);
            A.modify(goalA);
            B.modify(goalB);
            return;
          }
        }
    int chs = -1;
    for (int i = 0, _n = (n); i < _n; i = i + 1)
      if (goal.adj[i].size() < 3)
        if (chs < 0 || adj[i].size() < adj[chs].size()) chs = i;
    int u = chs;
    int x = (u - 1 + n) % n;
    int y = (u + 1 + n) % n;
    while (adj[u].size() > 2) {
      for (__typeof((adj[u]).begin()) it = (adj[u]).begin();
           it != (adj[u]).end(); it++)
        if (*it != x && *it != y) {
          pair<int, int> tmp = tryChange(u, it);
          fixChange(u, *it, tmp.first, tmp.second);
          break;
        }
    }
    Polygon A, B, goalA, goalB;
    splitPolygon(A, B, x, y);
    goal.splitPolygon(goalA, goalB, x, y);
    A.modify(goalA);
    B.modify(goalB);
  }
};
void process(void) {
  int n;
  scanf("%d", &n);
  Polygon src(n), des(n);
  src.input();
  des.input();
  src.modify(des);
  printf("%d\n", (int)allModify.size());
  for (__typeof((allModify).begin()) it = (allModify).begin();
       it != (allModify).end(); it++)
    printf("%d %d\n", it->first, it->second);
}
int main(void) {
  process();
  return 0;
}
