#include <bits/stdc++.h>
using namespace std;
const int N = 100100;
vector<pair<int, int>> a;
int m[2];
int c[2][N];
int n;
int get(int k, int a) {
  if (c[k][a] == a) return a;
  return c[k][a] = get(k, c[k][a]);
}
void un(int k, int a, int b) {
  a = get(k, a);
  b = get(k, b);
  if (b < a) swap(a, b);
  c[k][b] = a;
}
int main() {
  scanf("%d%d%d", &n, &m[0], &m[1]);
  for (int k = 0; k < 2; ++k) {
    for (int i = 0; i < n; ++i) c[k][i] = i;
    for (int i = 0; i < m[k]; ++i) {
      int u, v;
      scanf("%d%d", &u, &v);
      --u;
      --v;
      un(k, u, v);
    }
  }
  for (int i = 1; i < n; ++i)
    if (get(0, i) != 0 && get(1, i) != 0) {
      a.emplace_back(0, i);
      un(0, 0, i);
      un(1, 0, i);
    }
  for (int i = 0, j = 0; i < n && j < n;) {
    while (i < n && get(0, i) == 0) ++i;
    while (j < n && get(1, j) == 0) ++j;
    if (i < n && j < n) {
      a.emplace_back(i, j);
      un(0, i, j);
      un(1, i, j);
    }
  }
  printf("%d\n", (int)a.size());
  for (auto p : a) printf("%d %d\n", p.first + 1, p.second + 1);
}
