#include using namespace std; struct UnionFind { vector par; vector sz; UnionFind(int n=0){ if(n>0) initialize(n); } void initialize(int n){ par.resize(n); sz.resize(n); for(int i=0; i sz[y]) swap(x, y); par[x] = y; sz[y] += sz[x]; return true; } bool same(int x, int y){ return find(x) == find(y); } int size(int x){ return sz[find(x)]; } }; struct LCA{ static const int BITLEN_MAX = 20; vector parent[BITLEN_MAX]; vector depth; int bitlen; LCA(int N, vector>& edges){ int root = 0; bitlen = 1; while((1<>& edges){ parent[0][v] = p; depth[v] = d; for(auto u : edges[v]){ if(u != p) dfs(u, v, d+1, edges); } } int calc_lca(int u, int v){ if(depth[u] > depth[v]) swap(u, v); for(int k=0; k> k) & 1 ) v = parent[k][v]; } if(u == v) return u; for(int k=bitlen-1; k>=0; k--){ if(parent[k][u] != parent[k][v]){ u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } int calc_dist(int u, int v){ int l = calc_lca(u, v); return depth[u] + depth[v] - depth[l]*2; } }; vector dp, num; void dfs(int i, int p, vector& W, vector>& E){ num[i] = W[i]; for(int j : E[i]) if(j != p){ dfs(j, i, W, E); num[i] += num[j]; dp[i] += dp[j] + num[j]; } } void dfs2(int i, int p, vector& W, vector>& E, int64_t v, int n, int64_t& ans){ ans = min(ans, dp[i] + v); for(int j : E[i]) if(j != p){ int n2 = num[i] - num[j] + n; int64_t v2 = dp[i] - (dp[j] + num[j]) + v + n2; dfs2(j, i, W, E, v2, n2, ans); } } int64_t calc(vector& W, vector>& E){ int sz = W.size(); dp = vector(sz); num = vector(sz); dfs(0, -1, W, E); int64_t ans = 1e18; dfs2(0, -1, W, E, 0, 0, ans); // for(int a : W) cerr << a << " "; // cerr << endl; // cerr << ans << endl; return ans; } int main(){ int N, M, Q; cin >> N >> M >> Q; vector edges[100000]; UnionFind uf(N); for(int i=0; i> a >> b; a--; b--; edges[a].push_back(b); edges[b].push_back(a); uf.unite(a, b); } vector group(N, -1), pos(N); vector> vs; for(int i=0; i sz(G); vector> W(G); vector>> E(G); vector>> sames(G); for(int i=0; i> a >> b; a--; b--; if(uf.same(a, b)){ sames[group[a]].emplace_back(pos[a], pos[b]); }else{ W[group[a]][pos[a]]++; W[group[b]][pos[b]]++; } } int64_t ans = 0; for(int g=0; g