#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<climits>
#include<cstdio>
using namespace std;
#define inf 2147483647//2^31
#define ll 9223372036854775807//2^64
#define maxn 30000
struct bign
{
int len, s[maxn];
bign()
{
memset(s, 0, sizeof(s));
len = 1;
}
bign(int num)
{
*this = num;
}
bign(const char* num)
{
*this = num;
}
bign operator = (int num)
{
char s[maxn];
sprintf(s, "%d", num);
*this = s;
return *this;
}
bign operator = (const char* num)
{
len = strlen(num);
for (int i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
return *this;
}
string str() const
{
string res = "";
for (int i = 0; i < len; i++) res = (char)(s[i] + '0') + res;
if (res == "") res = "0";
return res;
}
bign operator + (const bign& b) const
{
bign c;
c.len = 0;
for (int i = 0, g = 0; g || i < max(len, b.len); i++)
{
int x = g;
if (i < len) x += s[i];
if (i < b.len) x += b.s[i];
c.s[c.len++] = x % 10;
g = x / 10;
}
return c;
}
void clean()
{
while(len > 1 && !s[len-1]) len--;
}
bign operator * (const bign& b)
{
bign c; c.len = len + b.len;
for (int i = 0; i < len; i++)
for (int j = 0; j < b.len; j++)
c.s[i+j] += s[i] * b.s[j];
for (int i = 0; i < c.len-1; i++)
{
c.s[i+1] += c.s[i] / 10;
c.s[i] %= 10;
}
c.clean();
return c;
}
bign operator - (const bign& b)
{
bign c; c.len = 0;
for (int i = 0, g = 0; i < len; i++)
{
int x = s[i] - g;
if (i < b.len) x -= b.s[i];
if (x >= 0)
g = 0;
else
{
g = 1;
x += 10;
}
c.s[c.len++] = x;
}
c.clean();
return c;
}
bool operator < (const bign& b) const
{
if (len != b.len) return len < b.len;
for (int i = len-1; i >= 0; i--)
if (s[i] != b.s[i]) return s[i] < b.s[i];
return false;
}
bool operator > (const bign& b) const
{
return b < *this;
}
bool operator <= (const bign& b)
{
return !(b > *this);
}
bool operator == (const bign& b)
{
return !(b < *this) && !(*this < b);
}
bool operator != (const bign& b)
{
return (b < *this) || (*this < b);
}
bign operator += (const bign& b)
{
*this = *this + b;
return *this;
}
};
istream& operator >> (istream &in, bign& x)
{
string s;
in >> s;
x = s.c_str();
return in;
}
ostream& operator << (ostream &out, const bign& x)
{
out << x.str();
return out;
}
string now[10240]={};
string goal[12040]={};
vector<int>tree[12040]={};
int k;
void build(int l,int r,int root){
if(k<0||l>r){
return;
}
string x=goal[k];
for(int i=l;i<=r;i++){
if(now[i]==x){
if(root==0){
int sum=0;
for(int j=0;j<x.size();j++){
sum=sum*10+x[j]-'0';
}
}
else{
int sum=0;
for(int j=0;j<x.size();j++){
sum=sum*10+x[j]-'0';
}
tree[root].push_back(sum);
}
int sun=0;
for(int j=0;j<x.size();j++){
sun=sun*10+x[j]-'0';
}
k--;
build(i+1,r,sun);
build(l,i-1,sun);
break;
}
}
}
int maxr=inf;
int ans=inf;
void dfs(int root,int sum){
if(tree[root].size()==0){
if(sum<maxr){
maxr=sum;
ans=root;
}
else if(sum==maxr){
if(ans>root){
ans=root;
}
}
}
for(int i=0;i<tree[root].size();i++){
dfs(tree[root][i],sum+tree[root][i]);
}
}
int main()
{
string a;
while(cin>>a){
maxr=inf;
ans=inf;
for(int i=0;i<12040;i++){
tree[i].clear();
}
memset(now,0,sizeof(now));
memset(goal,0,sizeof(goal));
int i=0;
now[i]=a;
i++;
if(cin.peek()!='\n'){
while(1){
cin>>a;
now[i]=a;
i++;
if(cin.peek()=='\n'){
break;
}
}
}
int q=0;
while(1){
string x;
cin>>x;
goal[q]=x;
q++;
if(cin.peek()=='\n'){
break;
}
}
k=q-1;
build(0,q-1,0);
int sun=0;
for(int f=0;f<goal[q-1].size();f++){
sun=sun*10+goal[q-1][f]-'0';
}
dfs(sun,0);
cout<<ans<<endl;
}
return 0;
}