/*
参考了一下别人的代码,才写出来的,感觉他的代码很优美,
简洁清爽的感觉。
附上网址:http://alwa.name/blog/?p=47
*/
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <string>
using namespace std;
int ans=0;
map<string,int>M;
map<string,int>N;
int vis[30];
int add[25][25];
struct node
{
int d;
int en;
}z[25];
void solve(int src,int de,int mi,int st,int go)
{
if(de==4&&mi==4&&st==2&&go==1)
{
int sum=0;
for(int i=0;i<23;i++)
if(vis[i])
{
sum+=z[i].d;
for(int j=0;j<23;j++)
if(vis[j])
{
sum+=add[i][j];
}
}
if(ans<sum) ans=sum;
return;
}
for(int i=src;i<23;i++)
if(!vis[i])
{
if(z[i].en==1&&de==4) continue;
if(z[i].en==2&&mi==4) continue;
if(z[i].en==3&&st==2) continue;
if(z[i].en==4&&go==1) continue;
vis[i]=1;
if(z[i].en==1) solve(i+1,de+1,mi,st,go);
if(z[i].en==2) solve(i+1,de,mi+1,st,go);
if(z[i].en==3) solve(i+1,de,mi,st+1,go);
if(z[i].en==4) solve(i+1,de,mi,st,go+1);
vis[i]=0;
}
}
int main()
{
string s="defender";
N[s]=1;
s="midfielder";
N[s]=2;
s="striker";
N[s]=3;
s="goalkeeper";
N[s]=4;
string l,r;
int d,n;
while(cin>>l>>d>>r)
{
M.clear();
M[l]=0;
z[0].d=d;
z[0].en=N[r];
for(int i=1;i<23;i++)
{
cin>>l>>d>>r;
M[l]=i;
z[i].d=d;
z[i].en=N[r];
}
int num_de=0,num_mi=0,num_st=0,num_go=0;
for(int i=0;i<23;i++)
{
if(z[i].en==1) num_de++;
if(z[i].en==2) num_mi++;
if(z[i].en==3) num_st++;
if(z[i].en==4) num_go++;
}
scanf("%d",&n);
memset(add,0,sizeof(add));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
cin>>l>>r>>d;
add[M[l]][M[r]]=d;
}
if(num_de<4||num_mi<4||num_st<2||num_go<1)
{
printf("impossible\n");
continue;
}
ans=-100000;//初始化为负数,最后ans可能为负数,wa了一次
solve(0,0,0,0,0);
printf("%d\n",ans);
}
return 0;
}