#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define F first
#define S second
#define Nanami signed
#define eb emplace_back
#define MASK(i) (1 << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
#define f(i, l, r) for(int i = l; i <= r; ++i)
#define e(i, l, r) for(int i = l; i >= r; --i)
const int mod = 1e9 + 7;
const int dom = 998244353;
const int ars = 3e5 + 5;
const int ii = 1e9;
const ll il = 1e18;
#define db double
int n, m[205]; db dist[205][205];
pair<db, db> p[205][205];
vector<tuple<int, int, ll>> edges;
int par[205], sz[205];
void Build(){
f(i, 1, n){
par[i] = i;
sz[i] = 1;
}
}
int Find(int u){
return par[u] == u ? u : par[u] = Find(par[u]);
}
bool Union(int u, int v){
u = Find(u);
v = Find(v);
if(u == v) return 0;
if(sz[u] < sz[v]) swap(u, v);
sz[u] += sz[v];
par[v] = u;
return 1;
}
void Kruskal(){
ll res = 0;
sort(edges.begin(), edges.end(), [&](auto &a, auto & b){
return get<2>(a) < get<2>(b);
});
for(auto [u, v, w] : edges){
if(Union(u, v)){
res += w;
}
}
cout << res;
}
double sqr_side(pair<db, db> x, pair<db, db> y){
return (x.F - y.F) * (x.F - y.F) + (x.S - y.S) * (x.S - y.S);
}
bool type(pair<db, db> a, pair<db, db> B, pair<db, db> C){
db aB = sqr_side(a, B);
db BC = sqr_side(B, C);
db Ca = sqr_side(C, a);
return (aB + BC > Ca and BC + Ca > aB);
}
double h(pair<db, db> a, pair<db, db> B, pair<db, db> C){
db s_2 = abs((B.F - a.F) * (C.S - a.S) - (C.F - a.F) * (B.S - a.S));
db BC = sqrt(sqr_side(B, C));
return s_2 / BC;
}
void xuly(int i, int j){
pair<double, double> B, C;
f(k, 1, m[i]) f(l, 1, m[j]){
B = p[j][l], C = p[j][l - 1];
if(type(p[i][k], B, C)){
double H = h(p[i][k], B, C);
dist[i][j] = min(dist[i][j], H);
dist[j][i] = min(dist[j][i], H);
}else{
dist[i][j] = min({dist[i][j],
sqrt(sqr_side(p[i][k], B)),
sqrt(sqr_side(p[i][k], C))});
dist[j][i] = min({dist[j][i],
sqrt(sqr_side(p[i][k], B)),
sqrt(sqr_side(p[i][k], C))});
}
}
}
Nanami main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> n;
Build();
f(i, 1, n){
cin >> m[i];
f(j, 1, m[i]) cin >> p[i][j].F >> p[i][j].S;
p[i][0] = p[i][m[i]];
}
f(i, 0, n) f(j, 0, n) dist[i][j] = (db)il;
f(i, 1, n){
f(j, i + 1, n){
xuly(i, j); xuly(j, i);
ll cost = (ll)floor(dist[i][j] * 1000000);
edges.eb(i, j, cost);
}
}
Kruskal();
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwojZGVmaW5lIEYgZmlyc3QKI2RlZmluZSBTIHNlY29uZAojZGVmaW5lIE5hbmFtaSBzaWduZWQKI2RlZmluZSBlYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBNQVNLKGkpICgxIDw8IChpKSkKI2RlZmluZSBCSVQoeCwgaSkgKCgoeCkgPj4gKGkpKSAmIDEpCiNkZWZpbmUgZihpLCBsLCByKSBmb3IoaW50IGkgPSBsOyBpIDw9IHI7ICsraSkKI2RlZmluZSBlKGksIGwsIHIpIGZvcihpbnQgaSA9IGw7IGkgPj0gcjsgLS1pKQpjb25zdCBpbnQgbW9kID0gMWU5ICsgNzsKY29uc3QgaW50IGRvbSA9IDk5ODI0NDM1MzsKY29uc3QgaW50IGFycyA9IDNlNSArIDU7CmNvbnN0IGludCBpaSA9IDFlOTsKY29uc3QgbGwgaWwgPSAxZTE4OwoKI2RlZmluZSBkYiBkb3VibGUKaW50IG4sIG1bMjA1XTsgZGIgZGlzdFsyMDVdWzIwNV07CnBhaXI8ZGIsIGRiPiBwWzIwNV1bMjA1XTsKdmVjdG9yPHR1cGxlPGludCwgaW50LCBsbD4+IGVkZ2VzOwoKaW50IHBhclsyMDVdLCBzelsyMDVdOwp2b2lkIEJ1aWxkKCl7CiAgICBmKGksIDEsIG4pewogICAgICAgIHBhcltpXSA9IGk7CiAgICAgICAgc3pbaV0gPSAxOwogICAgfQp9CgppbnQgRmluZChpbnQgdSl7CiAgICByZXR1cm4gcGFyW3VdID09IHUgPyB1IDogcGFyW3VdID0gRmluZChwYXJbdV0pOwp9Cgpib29sIFVuaW9uKGludCB1LCBpbnQgdil7CiAgICB1ID0gRmluZCh1KTsKICAgIHYgPSBGaW5kKHYpOwogICAgaWYodSA9PSB2KSByZXR1cm4gMDsKICAgIGlmKHN6W3VdIDwgc3pbdl0pIHN3YXAodSwgdik7CiAgICBzelt1XSArPSBzelt2XTsKICAgIHBhclt2XSA9IHU7CiAgICByZXR1cm4gMTsKfQogCnZvaWQgS3J1c2thbCgpewogICAgbGwgcmVzID0gMDsKICAgIHNvcnQoZWRnZXMuYmVnaW4oKSwgZWRnZXMuZW5kKCksIFsmXShhdXRvICZhLCBhdXRvICYgYil7CiAgICAgICAgcmV0dXJuIGdldDwyPihhKSA8IGdldDwyPihiKTsKICAgIH0pOwogICAgZm9yKGF1dG8gW3UsIHYsIHddIDogZWRnZXMpewogICAgICAgIGlmKFVuaW9uKHUsIHYpKXsKICAgICAgICAgICAgcmVzICs9IHc7CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCByZXM7Cn0KCmRvdWJsZSBzcXJfc2lkZShwYWlyPGRiLCBkYj4geCwgcGFpcjxkYiwgZGI+IHkpewogICAgcmV0dXJuICh4LkYgLSB5LkYpICogKHguRiAtIHkuRikgKyAoeC5TIC0geS5TKSAqICh4LlMgLSB5LlMpOwp9Cgpib29sIHR5cGUocGFpcjxkYiwgZGI+IGEsIHBhaXI8ZGIsIGRiPiBCLCBwYWlyPGRiLCBkYj4gQyl7CiAgICBkYiBhQiA9IHNxcl9zaWRlKGEsIEIpOwogICAgZGIgQkMgPSBzcXJfc2lkZShCLCBDKTsKICAgIGRiIENhID0gc3FyX3NpZGUoQywgYSk7CiAgICByZXR1cm4gKGFCICsgQkMgPiBDYSBhbmQgQkMgKyBDYSA+IGFCKTsKfQoKZG91YmxlIGgocGFpcjxkYiwgZGI+IGEsIHBhaXI8ZGIsIGRiPiBCLCBwYWlyPGRiLCBkYj4gQyl7CiAgICBkYiBzXzIgPSBhYnMoKEIuRiAtIGEuRikgKiAoQy5TIC0gYS5TKSAtIChDLkYgLSBhLkYpICogKEIuUyAtIGEuUykpOwogICAgZGIgQkMgPSBzcXJ0KHNxcl9zaWRlKEIsIEMpKTsKICAgIHJldHVybiBzXzIgLyBCQzsKfQoKdm9pZCB4dWx5KGludCBpLCBpbnQgail7CiAgICBwYWlyPGRvdWJsZSwgZG91YmxlPiBCLCBDOwogICAgZihrLCAxLCBtW2ldKSBmKGwsIDEsIG1bal0pewogICAgICAgIEIgPSBwW2pdW2xdLCBDID0gcFtqXVtsIC0gMV07CiAgICAgICAgaWYodHlwZShwW2ldW2tdLCBCLCBDKSl7CiAgICAgICAgICAgIGRvdWJsZSBIID0gaChwW2ldW2tdLCBCLCBDKTsKICAgICAgICAgICAgZGlzdFtpXVtqXSA9IG1pbihkaXN0W2ldW2pdLCBIKTsKICAgICAgICAgICAgZGlzdFtqXVtpXSA9IG1pbihkaXN0W2pdW2ldLCBIKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgZGlzdFtpXVtqXSA9IG1pbih7ZGlzdFtpXVtqXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FydChzcXJfc2lkZShwW2ldW2tdLCBCKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxcnQoc3FyX3NpZGUocFtpXVtrXSwgQykpfSk7CiAgICAgICAgICAgIGRpc3Rbal1baV0gPSBtaW4oe2Rpc3Rbal1baV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FydChzcXJfc2lkZShwW2ldW2tdLCBCKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FydChzcXJfc2lkZShwW2ldW2tdLCBDKSl9KTsKICAgICAgICB9CiAgICB9Cgp9CgpOYW5hbWkgbWFpbigpewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgY2luID4+IG47CiAgICBCdWlsZCgpOwogICAgZihpLCAxLCBuKXsKICAgICAgICBjaW4gPj4gbVtpXTsgCiAgICAgICAgZihqLCAxLCBtW2ldKSBjaW4gPj4gcFtpXVtqXS5GID4+IHBbaV1bal0uUzsKICAgICAgICBwW2ldWzBdID0gcFtpXVttW2ldXTsKICAgIH0KICAgIGYoaSwgMCwgbikgZihqLCAwLCBuKSBkaXN0W2ldW2pdID0gKGRiKWlsOwoKICAgIGYoaSwgMSwgbil7CiAgICAgICAgZihqLCBpICsgMSwgbil7CiAgICAgICAgICAgIHh1bHkoaSwgaik7IHh1bHkoaiwgaSk7CiAgICAgICAgICAgIGxsIGNvc3QgPSAobGwpZmxvb3IoZGlzdFtpXVtqXSAqIDEwMDAwMDApOwogICAgICAgICAgICBlZGdlcy5lYihpLCBqLCBjb3N0KTsKICAgICAgICB9CiAgICB9CgogICAgS3J1c2thbCgpOwoKCiAgICByZXR1cm4gMDsKfQ==