#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;
struct Player
{
string name;
int score;
int pos;
Player(){}
Player(string nn,int ss,int pp)
{
name=nn;
score=ss;
pos=pp;
}
}player[4][50];
map<string,int> playerName;
string name1,name2;
int vis[50][50];
int val;
int m;
int cnt[4],num[4]={1,4,4,2};
string position,name;
int score;
int pos[4][4];
int ans;
void getDate(int i)
{
if(position=="goalkeeper")
player[0][cnt[0]++]=Player(name,score,i);
else
{
if(position=="defender")
player[1][cnt[1]++]=Player(name,score,i);
else
{
if(position=="midfielder")
player[2][cnt[2]++]=Player(name,score,i);
else
player[3][cnt[3]++]=Player(name,score,i);
}
}
}
bool judge()
{
for(int i=0;i<4;i++)
if(cnt[i]<num[i])
return 0;
return 1;
}
void print()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<cnt[i];j++)
printf("%d ",player[i][pos[i][j]].pos);
cout<<endl;
}
}
void dfs(int sum,int n,int k,int x)// 正在确定的位置 当前位置确定数
{
if(n==4)
{
int ff=0;
for(int i=0;i<4;i++)
for(int j=0;j<num[i];j++)
for(int ii=i;ii<4;ii++)
for(int jj=0 ;jj<num[ii];jj++)
if(ii==i&&j<jj)
continue;
else
sum+=vis[player[i][pos[i][j]].pos][player[ii][pos[ii][jj]].pos];
if(ans<sum)
ans=sum;
return;
}
if(k==num[n])
{
dfs(sum,n+1,0,-1);
return;
}
for(int i=x+1;i<cnt[n];i++)
{
pos[n][k]=i;
sum+=player[n][i].score;
dfs(sum,n,k+1,i);
sum-=player[n][i].score;
}
}
int main()
{
while(cin>>name>>score>>position)
{
playerName.clear();
playerName[name]=0;
memset(vis,0,sizeof(vis));
memset(cnt,0,sizeof(cnt));
getDate(0);
for(int i=1;i<=22;i++)
{
cin>>name>>score>>position;
playerName[name]=i;
getDate(i);
}
cin>>m;
for(int i=0;i<m;i++)
{
cin>>name1>>name2>>val;
vis[playerName[name1]][playerName[name2]]=val;
vis[playerName[name2]][playerName[name1]]=val;
}
if(!judge())
cout<<"impossible"<<endl;
else
{
ans=-10000000;
dfs(0,0,0,-1);
cout<<ans<<endl;
}
}
}