#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
const int MaxN=31;
const double Zero=0.0001;
struct sign{
int bsszName,distance;
}signList[MaxN];
char bssz[MaxN][MaxN];
int cmp(const *a1,const *b1){
sign *a=(struct sign*)a1;
sign *b=(struct sign*)b1;
if(a->distance>b->distance) return 1;
else if(a->distance==b->distance) return strcmp(bssz[a->bsszName],bssz[b->bsszName]);
else return -1;
}
int main()
{
double path[MaxN][MaxN],graph[MaxN][MaxN];
int shortPath[MaxN][MaxN],cases,bsszLocation[MaxN];
scanf("%d",&cases);
int iCase;
for(iCase=1;iCase<=cases;iCase++){
int i,j,k,a,b,m,n,cross;
double d;
char name[MaxN];
scanf("%d%d%d",&n,&m,&cross);
memset(graph,0,sizeof(graph));
memset(bsszLocation,255,sizeof(bsszLocation));
for(i=1;i<=m;i++){
scanf("%d%d%lf",&a,&b,&d);
graph[a][b]=graph[b][a]=d;
}
for(i=0;i<cross;i++){
scanf("%d",&a);
bsszLocation[a]=i;
scanf("%signNum",name);
strcpy(bssz[i],name);
}
memcpy(path,graph,sizeof(graph));
for(k=0;k<n;k++){
for(i=0;i<n;i++){
if(path[i][k]>Zero){
for(j=0;j<n;j++){
if(path[k][j]>Zero&&i!=j){
d=path[i][k]+path[k][j];
if(path[i][j]<Zero||path[i][j]>d) path[i][j]==d;
}
}
}
}
}
for(i=0;i<n;i++) path[i][i]=0;
memset(shortPath,255,sizeof(shortPath));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(bsszLocation[j]>=0){
for(k=0;k<n;k++){
if(graph[i][k]>=Zero&&fabs(path[i][j]-path[k][j]-graph[i][k])<Zero){
shortPath[i][j]=k;break;
}
}
}
}
}
if(iCase!=1) printf("\n");
int listNum,signNum;
scanf("%d",&signNum);
for(i=0;i<signNum;i++){
scanf("%d%d%lf",&a,&b,&d);
if(i!=0) printf("\n");
listNum=-1;
for(j=0;j<n;j++){
if(bsszLocation[j]>=0&&shortPath[a][j]==b){
signList[++listNum].bsszName=bsszLocation[j];
signList[listNum].distance=int(path[a][j]-d+Zero+0.5);
}
}
qsort(signList,listNum+1,sizeof(sign),&cmp);
for(j=0;j<listNum;j++){
printf("%-20s",bssz[signList[j].bsszName])