#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>

using namespace std;

struct edge{
  int t,d;
};

int bit[10];
map<int,map<int,int> > mem;
int d[11][11];
int INF=1<<29;

int rec(int b,int p,int u){
  if(b==0)return d[p][0];
  if(mem[p].count(b))return mem[p][b];
  int m=INF;
  for(int i=0;i<11;i++){
    if(u>>i&1)continue;
    int nb=b&~bit[i-1];
    m=min(m,rec(nb,i,u|1<<i)+d[p][i]);
  }
  return mem[p][b]=m;
}

int main(){
  for(int n;cin>>n,n;){
    map<string,int> mc;
    map<string,int> sp[10];
    for(int i=0;i<n;i++){
      int k;
      cin>>k;
      while(k--){
	string n;
	int v;
	cin>>n>>v;
	if(mc.count(n)==0||mc[n]>v){
	  mc[n]=v;
	}
	if(sp[i].count(n)==0||sp[i][n]>v){
	  sp[i][n]=v;
	}
      }
      bit[i]=0;
    }
    int q;
    cin>>q;
    int sum=0;
    for(int i=0;i<q;i++){
      string name;
      cin>>name;
      sum+=mc[name];
      for(int j=0;j<n;j++){
	bit[j]|=(sp[j].count(name)&&sp[j][name]==mc[name])<<i;
      }
    }
    int m;
    cin>>m;
    fill(d[0],d[11],INF);
    for(int i=0;i<m;i++){
      int s,t,di;
      cin>>s>>t>>di;
      d[s][t]=d[t][s]=min(d[s][t],di);
    }
    for(int i=0;i<11;i++){
      for(int j=0;j<11;j++){
	for(int k=0;k<11;k++){
	  d[j][k]=min(d[j][i]+d[i][k],d[j][k]);
	}
      }
    }
    mem.clear();
    int md=rec((1<<q)-1,0,1);
    if(q==0){
      cout<<"0 0"<<endl;
    }else if(md>=INF){
      cout<<"impossible"<<endl;
    }else{
      cout<<sum<<' '<<md<<endl;
    }
  }
}