#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
int ne[N], e[N], w[N], h[N], idx;
int d[N], cur[N];
int s = 1, t = 26;
void add(int a, int b, int c)
{
e[idx] = b;
w[idx] = c;
ne[idx] = h[a];
h[a] = idx++;
}
bool bfs()
{
memset(d, 0, sizeof(d));
d[s] = 1;
queue<int> op;
op.push(s);
while (op.size())
{
auto x = op.front();
op.pop();
for (int i = h[x]; i != -1; i = ne[i])
{
int j = e[i];
if (w[i] > 0 && !d[j])
{
d[j] = d[x] + 1;
if (j == t) return 1;
op.push(j);
}
}
}
return 0;
}
int dfs(int u, int sum)
{
if (u == t || !sum) return sum;
int flow = 0;
for (int& i = cur[u]; i != -1; i=ne[i])
{
int f, j = e[i];
if (d[j] == d[u] + 1 && (f = dfs(j, min(w[i], sum))))
{
sum -= f;
flow += f;
w[i] -= f;
w[i ^ 1] += f;
if (!sum) break;
}
}
return flow;
}
signed main()
{
memset(h, -1, sizeof(h));
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
string a, b;
cin >> a >> b;
int x;
cin >> x;
add(int(a[0] - 'A' + 1), int(b[0] - 'A' + 1), x);
add(int(b[0] - 'A' + 1), int(a[0] - 'A' + 1), 0);
}
int ans = 0;
while (bfs())
{
for (int i = 0; i < idx; i++) cur[i] = h[i];
ans += dfs(s, 0x3f3f3f3f);
}
cout << ans;
}