#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
inline int read(){
int w=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
w=w*10+ch-'0';
ch=getchar();
}
return w*f;
}
const int inf=0x7fffffff;
int n,m,s,t;
int incf[30],pre[30];
bool v[30];
long long maxflow;
int tot=1,nxt[1405],head[705],edge[1405],ver[1405];
void add(int u,int v,int w){
nxt[++tot]=head[u],ver[tot]=v,edge[tot]=w,head[u]=tot;
nxt[++tot]=head[v],ver[tot]=u,edge[tot]=0,head[v]=tot;
}
bool bfs(){
memset(v,0,sizeof(v));
queue<int> q;
q.push(s);v[s]=1;
incf[s]=inf;
while(q.size()){
int x=q.front();q.pop();
for(int i=head[x];i;i=nxt[i]){
if(edge[i]){
int y=ver[i];
if(v[y]) continue;
incf[y]=min(incf[x],edge[i]);
pre[y]=i;
q.push(y),v[y]=1;
if(y==t) return 1;
}
}
}
return false;
}
void update(){
int x=t;
while(x!=s){
int i=pre[x];
edge[i]-=incf[t];
edge[i^1]+=incf[t];
x=ver[i^1];
}
maxflow+=incf[t];
}
int dot(char c){
if(c>='A'&&c<='Z') return c-'A'+1;
return c-'a'+1;
}
int main(){
m=read();
for(int i=1;i<=m;i++){
char u,v;
cin>>u>>v;
int w=read();
add(dot(u),dot(v),w);
}
s=1,t=26;
while(bfs()) update();
cout<<maxflow;
return 0;
}