#include #define rep(i, a, b) for(int i = (a); i <= (b); i ++) using std::cin, std::cout, std::cerr; using ll = long long; struct DSU { int n; std::vector p, size; DSU(int n) { Init(n); } void Init(int n) { this->n = n; p.resize(n); size.assign(n, 1); std::iota(p.begin(), p.end(), 0); } int operator ()(int x) { if(x == p[x]) return x; return p[x] = this->operator()(p[x]); } void Link(int x, int y) { size[y] += size[x]; p[x] = y; } }; int main() { std::ios::sync_with_stdio(false); int n, m, k; cin >> n >> m >> k; std::vector> e(n + 1); rep(i, 1, m) { int x, y; cin >> x >> y; e[x].push_back(y); e[y].push_back(x); } DSU dsu(n + 1); rep(i, 1, k) { int x, y; cin >> x >> y; x = dsu(x); y = dsu(y); if(x != y) dsu.Link(x, y); } std::vector v; std::vector vis(n + 1); std::function dfs = [&](int x) { vis[x] = 1; v.push_back(x); for(int i : e[x]) if(!vis[i]) dfs(i); }; ll ans = 0; rep(i, 1, n) if(!vis[i]) { v.clear(); dfs(i); std::set set; for(int x : v) { int y = dsu(x); if(!set.count(y)) { set.insert(y); ans += ll(v.size()) * dsu.size[y]; } } } cout << ans - n << '\n'; }