/* 有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 */