#include using i64 = long long; using u64 = unsigned long long; using u32 = unsigned; using u128 = unsigned __int128; using i128 = __int128; struct DSU { std::vector f, siz; DSU() {} DSU(int n) { init(n); } void init(int n) { f.resize(n); std::iota(f.begin(), f.end(), 0); siz.assign(n, 1); } int find(int x) { while (x != f[x]) { x = f[x] = f[f[x]]; } return x; } bool same(int x, int y) { return find(x) == find(y); } bool merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return false; } siz[x] += siz[y]; f[y] = x; return true; } int size(int x) { return siz[find(x)]; } }; struct Edge { i64 w; int u, v; bool operator<(const Edge& o) const { return w < o.w; } }; i64 kruskal(int n, std::vector edges) { std::sort(edges.begin(), edges.end()); DSU dsu(n); i64 total = 0; int taken = 0; for(const Edge& e : edges) { if(dsu.merge(e.u, e.v)) { total += e.w; taken ++; } } return taken == n - 1 ? total : -1; } void solve() { int N; std::cin >> N; std::vector C(N), D(N); i64 Z = 0; for(int i = 0; i < N; i ++) { std::cin >> C[i] >> D[i]; Z += C[i]; } std::vector edges; for(int i = 0; i < N; i ++) edges.push_back({C[i], 0, i + 1}); for(int i = 1; i < N; i ++) edges.push_back({D[i], i, i + 1}); std::cout << Z + kruskal(N + 1, edges) << "\n"; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int T = 1; //std::cin >> T; while (T--) { solve(); } return 0; }