#include <cstdio>
#include <cstring>
#include <vector>
#define MASK first
#define COST second
#define QLEN 20005
int n,m,r,B,lst[20];
long long f[1<<15],g[20][20],cost[1<<15];
std::vector<std::pair<int,long long> > taxi;
int tot,e[100010][2],v[100010],p[20010];
int q[20010];
long long dis[20010];
short vis[20010];
void adde(int sn,int fn,int val)
{
    e[++tot][0] = fn; v[tot] = val; e[tot][1] = p[sn]; p[sn] = tot;
}
void spfa(int S)
{
    int head = 1,tail = 2;
    int i,sn,fn;
    memset(dis,60,sizeof(dis));
    q[1] = S; dis[S] = 0; vis[S] = 1;
    while(head != tail)
    {
        sn = q[head++];
        for(i=p[sn];i;i=e[i][1])
        {
            fn = e[i][0];
            if(dis[fn] <= dis[sn]+v[i]) continue;
            dis[fn] = dis[sn]+v[i];
            if(vis[fn]) continue;
            vis[fn] = 1; q[tail++] = fn;
            if(tail > QLEN) tail = 1;
        }
        vis[sn] = 0;
        if(head > QLEN) head = 1;
    }
}
void dfs(int dep,int last,long long sum,int mask)
{
    int i;
    if(dep) { cost[mask] = std::min(cost[mask],sum); if(dep==4) return;}
    for(i=1;i<=r;i++) if(!(mask>>(i-1)&1)) dfs(dep+1,i,sum+g[last][i],mask|(1<<(i-1)));
}
int main()
{
    int i,j,x,sn,fn,val;
    int LIM;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d%d",&x,&sn,&fn,&val);
        adde(sn,fn,val);
        if(x>1) adde(fn,sn,val);
    }
    scanf("%d%d%d",&B,&lst[0],&r); LIM = 1<<r;
    for(i=1;i<=r;i++) scanf("%d",&lst[i]);
    for(i=0;i<=r;i++)
    {
        spfa(lst[i]);
        for(j=0;j<=r;j++) g[i][j] = dis[lst[j]];
    }
    
    memset(cost,60,sizeof(cost)); dfs(0,0,0,0);
    for(i=1;i<LIM;i++) if(cost[i] < cost[0]) taxi.push_back(std::make_pair(i,cost[i]));
    memset(f,60,sizeof(f)); f[0] = 0;
    for(i=0;i<LIM;i++) for(j=taxi.size()-1;j>=0;j--)
    {
        if(i & taxi[j].MASK) continue;
        f[i | taxi[j].MASK] = std::min(f[i | taxi[j].MASK], f[i]+taxi[j].COST+B);
    }
    printf("%lld",f[LIM-1]);
    return 0;
}