#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;   }   