/*
有n个城市,规定m个城市必须去,从起点出发返回起点,在规定时间内,求能经过的最大城市数
每到一个城市要休息a[i]时间 ,先floyd求得个点的最短距离,然后状态压缩DP 求一个类似汉密尔顿回路
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const double INF=1e9;
int n,m,day,u,v,kind,len;
double dp[20][1<<16],a[20],map[22][22];
void floyd()
{
int i,j,k;
for(k=0; k<n; k++)
{
for(i=0; i<n; i++)
{
if(i!=k||map[i][k]<INF)
for(j=0; j<n; j++)
{
if(i!=j||map[k][j]<INF)
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
}
}
}
}
}
void init()
{
int i,j;
for(i=0; i<n; i++)
{
for(j=0; j<(1<<n); j++)
{
dp[i][j]=INF;
}
for(j=0; j<n; j++)
{
map[i][j]=INF;
}
map[i][i]=0;
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&day),(n||m||day))
{
double day1=day*12.0;
int i,j,k,res=0,ans=-1,cnt;
init();
for(i=1; i<=m; i++)
{
scanf("%d",&j);
res+=1<<(j-1);
}
for(i=0; i<n; i++)
{
scanf("%lf",&a[i]);
}
while(scanf("%d%d%d%d",&u,&v,&len,&kind),(u||v||len||kind))
{
u--,v--;
double hour=len*1.0/(kind?120.0:80.0);
if(map[u][v]>hour) map[u][v]=hour,map[v][u]=hour;
}
floyd();
// dp[0][0]=0;
for(i=1; i<n; i++) dp[i][1<<i]=map[0][i]+a[i];
for(j=0; j<(1<<n); j++)
{
for(i=0; i<n; i++)
{
if(j&(1<<i)&&j!=(1<<i))
{
for(k=0; k<n; k++)
{
if(j&(1<<k)&&i!=k&&j!=(1<<k))
{
dp[i][j]=min(dp[i][j],dp[k][j-(1<<i)]+map[k][i]+a[i]);
}
}
if(((j&res)==res)&&dp[i][j]+map[i][0]<=day1)
{
// cout<<dp[i][j]+map[i][0]<<endl;
int tmp=j;
cnt=0;
while(tmp)
{
if(tmp%2)cnt++;
tmp>>=1;
}
ans=max(ans,cnt);
}
}
}
}
if(ans>=0)
printf("%d\n",ans);
else printf("No Solution\n");
}
return 0;
}
/*
3 3 3
1 2 3
10 8 6
1 2 120 0
1 3 60 1
2 3 50 1
0 0 0 0
3 3 2
1 2 3
10 8 6
1 2 120 0
1 3 60 1
2 3 50 1
0 0 0 0
0 0 0
*/