#include #include #include #include using namespace std; const int LOG = 22; vector G[100010],ver[100010]; int parent[25][100010]; long long d[100010]; void dfs(int v, int p){ for(int x:G[v]){ if(x==p) continue; parent[0][x] = v; d[x] = d[v] + 1; dfs(x,v); } } void init(int v,int root){ d[root] = 0; parent[0][root] = -1; dfs(root,-1); for(int k=0;k+1d[v]) swap(u,v); for(int k = 0;k=0;k--){ if(parent[k][u]!=parent[k][v]){ u = parent[k][u]; v = parent[k][v]; } } return parent[0][u]; } long long dist(int u, int v){ int z = lca(u,v); return d[u] + d[v] - 2*d[z]; } int par[100010],sz[100010]; void unite_init(int n){ for(int i=0;i ma[100010]; int dp[100010]; int dfs2(int v, int p){ int ret = 0,x = find(v); if(ma[x].find(v)!=ma[x].end()){ ret += ma[x][v]; } for(int u:G[v]){ if(u==p) continue; ret += dfs2(u,v); } dp[v] = ret; return ret; } int search(int v,int p){ int mx = -1,j = -1; for(int u:G[v]){ if(u==p) continue; if(mxsum) return search(j,v); return j; } int main(){ int i,n,m,q; cin >> n >> m >> q; unite_init(n); for(i=0;i> u >> v; u--; v--; G[u].push_back(v); G[v].push_back(u); unite(u,v); } for(i=0;i> a >> b; a--; b--; if(same(a,b)){ ans += dist(a,b); }else{ ma[find(a)][a]++; ma[find(b)][b]++; } } for(i=0;i=0); cout << ans << endl; }