#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;

int n,m,cap;
string ssrc,sdest;
int src,dest;
set<string>s;
string ss;
map<string,int> mp;
int des[3005];
string a[3000];
string b[3000];

struct node{
	int dis;
	int to;
	node(int dis,int to):dis(dis),to(to){
	}
};
set<string>::iterator it;





struct node1{
	int go;
	int node;
};
queue<node1>q;





bool flag[3333];
int dist[3333][2000];
vector<node>p[3333];
bool inq[3333];
int main()
{
	while(1)
	{
		scanf("%d %d %d",&n,&m,&cap);
		cap*=10;
		cin>>ssrc>>sdest;
		s.insert(ssrc);
		s.insert(sdest);
		for(int i=0;i<n;i++)
		{
			cin>>a[i]>>b[i]>>des[i];
			s.insert(a[i]);
			s.insert(b[i]);
		}
		int num=0;
		for(it=s.begin();it!=s.end();it++)
		{
			mp[*it]=num;
			num++;
		}
		for(int i=0;i<n;i++)
		{
			p[mp[a[i]]].push_back(node(mp[b[i]],des[i]));
			p[mp[b[i]]].push_back(node(mp[a[i]],des[i]));
		}
		for(int i=0;i<m;i++)
		{
			cin>>ss;
			flag[mp[ss]]=1;
		}
	//	for(int i=0;i<num;i++)printf("%d\n",flag[i]);
     	src=mp[ssrc];
    	dest=mp[sdest];
    	
    	
    	
    	for(int i=0;i<num;i++)
    	{
    		for(int j=0;j<=cap;j++)
    		dist[i][j]=inf;
    	}
    	dist[src]=0;
    	node1 now,then;
    	now.go=cap;
    	now.node=src;
    	q.push(now);
    	while(!q.empty())
    	{
    		now=q.front();
    		q.pop();
    		inq[now.node]=0;
    		then.go=now.go;
    		if(flag[now.node]==1)
    		{
    			then.go=cap;
    		}
    		for(int i=0;i<p[now.node].size();i++)
    		{
    			int d=p[now][i].dis;
    			int t=p[now][j].t;
    			if(then.go>d&&dis[t][then.go-d]>dis[now.node][now.go]+d)
    			{
    				
    			}
    		}
    	}
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
    	
	}
}