#include
#include
#include
using namespace std;
const int INF = 2e9;
class Graph {
private:
vector> adj_matrix;
public:
Graph() {
}
Graph(int n) {
adj_matrix = vector>(n, vector(n, 0));
}
void add_edge(int a, int b, int c) {
adj_matrix[a][b] = c;
}
int get_cell(int i, int j) {
return adj_matrix[i][j];
}
void set_cell(int i, int j, int x) {
adj_matrix[i][j] = x;
}
};
class STCut {
private:
int n;
int S, T;
Graph adj, r_graph;
public:
STCut(int n, int S, int T, Graph adj, Graph r_graph) {
this->n = n;
this->S = S;
this->T = T;
this->adj = adj;
this->r_graph = r_graph;
}
int bfs(vector & parent) {
vector visited(n, false);
queue q;
q.push(S);
visited[S] = true;
parent[S] = -1;
while(!q.empty()) {
int c = q.front();
q.pop();
for(int i = 0; i < 30; i++) {
if(r_graph.get_cell(c, i) > 0 and !visited[i]) {
q.push(i);
parent[i] = c;
visited[i] = true;
}
}
}
if(visited[T]) {
return true;
}
return false;
}
void dfs(vector & visited, int node) {
visited[node] = true;
for(int i = 0; i < 30; i++) {
if(r_graph.get_cell(node, i) > 0 and !visited[i]) {
dfs(visited, i);
}
}
}
int min_cut() {
vector parent(30);
while(bfs(parent)) {
int path_flow = INF;
for(int i = T; i != S; i = parent[i]) {
int j = parent[i];
path_flow = min(path_flow, r_graph.get_cell(j, i));
}
for(int i = T; i != S; i = parent[i]) {
int j = parent[i];
r_graph.set_cell(i, j, r_graph.get_cell(i, j) + path_flow);
r_graph.set_cell(j, i, r_graph.get_cell(j, i) - path_flow);
}
}
vector visited(30, false);
dfs(visited, S);
int res = 0;
for(int i = 0; i < 30; i++) {
for(int j = 0; j < 30; j++) {
if(visited[i] and !visited[j] and adj.get_cell(i, j)) {
res += adj.get_cell(i, j);
}
}
}
return res;
}
};
int main() {
int n;
cin >> n;
char a, b;
cin >> a >> b;
int S = a - 'A';
int T = b - 'A';
Graph g(30);
for(int i = 0; i < n; i++) {
char A, B;
int c;
cin >> A >> B >> c;
int tmp_a = A - 'A';
int tmp_b = B - 'A';
g.add_edge(tmp_a, tmp_b, c);
g.add_edge(tmp_b, tmp_a, c);
}
STCut st(n, S, T, g, g);
cout << st.min_cut();
}