#include <bits/stdc++.h>
using namespace std;
struct UF {
  vector<int> par, sz;
  UF(int n) {
    sz.resize(n);
    par.resize(n);
    for (int i = 0; i < n; i++) sz[i] = 1, par[i] = i;
  }
  int find(int x) {
    if (par[x] == x) return x;
    return par[x] = find(par[x]);
  }
  void unite(int x, int y) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (sz[x] > sz[y]) swap(x, y);
    sz[y] += sz[x];
    par[x] = y;
  }
  bool same(int x, int y) { return find(x) == find(y); }
};
int main() {
  int i, j, n, m1, m2;
  cin >> n >> m1 >> m2;
  UF uf1(n), uf2(n);
  for (i = 0; i < m1; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    uf1.unite(a, b);
  }
  for (i = 0; i < m2; i++) {
    int a, b;
    cin >> a >> b;
    a--;
    b--;
    uf2.unite(a, b);
  }
  vector<pair<int, int>> p;
  for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (!uf1.same(i, j)) p.push_back({i, j});
    }
  }
  int ans = 0;
  vector<pair<int, int>> ansv;
  for (i = 0; i < p.size(); i++) {
    int x = p[i].first, y = p[i].second;
    if (!uf1.same(x, y) && !uf2.same(x, y)) {
      uf1.unite(x, y);
      uf2.unite(x, y);
      ans++;
      ansv.push_back({x, y});
    }
  }
  cout << ans << endl;
  for (auto p : ansv) cout << p.first + 1 << " " << p.second + 1 << endl;
}
