#include <iostream>
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <functional>
#include <set>
#include <queue>
#include <cctype>
#include <climits>
#include <stack>
#include <unordered_map>
  
using namespace std;
 
template <typename T>
class UF{
public:
    T par[5000],rank[5000];
  
    inline UF(T n){
        for(T i=0;i<n;i++){
            par[i]=i;
            rank[i]=0;
        }
    }
  
    inline T find(T x){
        if(par[x]==x)
            return x;
        else
            return par[x]=find(par[x]);
    }
  
    inline void unite(T x, T y){
        x=find(x);
        y=find(y);
        if(x==y) return;
  
        if(rank[x]<rank[y])
            par[x]=y;
        else{
            par[y]=x;
            if(rank[x] == rank[y]) rank[x]++;
        }
    }
  
    inline bool same(T x, T y){
        return find(x)==find(y);
    }
  
};

int main(){
	int n;
	cin>>n;
	UF<int> uf(n);	
	unordered_map<string,int> id;
	
	string s,s2;
	int x,cost[5000];
	for(int i=0;i<n;i++){
		cin>>s>>x;
		cost[id[s]=i]=x;
	}
	
	int q;
	cin>>q;
	while(q--){
		cin>>s>>s2;
		uf.unite(id[s],id[s2]);
	}
	
	for(int i=0;i<n;i++){
		x=uf.find(i);
		cost[x]=min(cost[x],cost[i]);
	}

	int ans=0;
	for(int i=0;i<n;i++){
		ans+=cost[uf.find(i)];
	}
	cout<<ans<<endl;
	
	return 0;
}