//土尔逊Torson 编写于2023/07/07
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cstdio>
#include <stdlib.h>
#include <map>
#include <algorithm>
#define N 101
using namespace std;
int Total_Costs;
struct Jungle_Roads_dot {
int from;
int to;
int costs;
inline bool operator < (const Jungle_Roads_dot &r) const {
return costs < r.costs;
}
};
vector<Jungle_Roads_dot> Graph_J13701;
map<char, int> Alphabetical;
int father13701[N];
int height13701[N];
void Init13701(int n) {
for (int i = 0; i < n; ++i) {
father13701[i] = i;
height13701[i] = 0;
}
Total_Costs = 0;
for (int i = 0; i < 26; ++i) {
Alphabetical['A' + i] = i + 1;
}
}
int find13701(int x) {
if (x != father13701[x]) {
father13701[x] = find13701(father13701[x]);
}
return father13701[x];
}
void Union13701(int x, int y, int costs) {
x = find13701(x);
y = find13701(y);
if (x != y) {
Total_Costs += costs;
if (height13701[x] > height13701[y]) {
father13701[y] = x;
}
else if (height13701[x] < height13701[y]) {
father13701[x] = y;
}
else {
father13701[x] = y;
height13701[y]++;
}
}
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
Init13701(n);
Jungle_Roads_dot JRd;
for (int i = 0; i < n - 1; ++i) {
getchar();
char tmp;
int m;
scanf("%c %d", &tmp, &m);
while (m--) {
char tmp_to;
int m_costs;
getchar();
scanf("%c %d", &tmp_to, &m_costs);
JRd.from = Alphabetical[tmp];
JRd.to = Alphabetical[tmp_to];
JRd.costs = m_costs;
Graph_J13701.push_back(JRd);
}
}
sort(Graph_J13701.begin(), Graph_J13701.end());
for (int i = 0; i < Graph_J13701.size(); ++i) {
Union13701(Graph_J13701[i].from, Graph_J13701[i].to, Graph_J13701[i].costs);
}
printf("%d\n", Total_Costs);
//for (int i = 0; i < 26; ++i) {
// printf("%c %d\n", 'A' + i, Alphabetical['A' + i]);
//}
}
system("pause");
return EXIT_SUCCESS;
}
// 64 位输出请用 printf("%lld")