#include<stdio.h>
#include<assert.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
#define OVER9000 900000001
int n,m,t,sol=9000001,sp[10],prm[10],inprm[10],cost[50],dad[50],hue[50];
vector<pair<int,int> > a[50];
void read()
{
assert(freopen("subarbore.in","r",stdin)!=NULL);
int i,x,y,c;
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d%d",&x,&y,&c);
a[x].push_back(make_pair(c,y));
a[y].push_back(make_pair(c,x));
}
scanf("%d",&t);
for(i=1;i<=t;++i)
scanf("%d",&sp[i]);
}
void update(int x,int y)
{
while(x!=y)
{
hue[x]=1;
x=dad[x];
}
}
void dijkstra(int x)
{
int i,curent,val,vecin,muchie;
priority_queue< pair<int,int>,vector <pair<int,int> >,greater <pair<int,int> > > h;
for(i=1;i<=n;++i)
cost[i]=OVER9000;
cost[x]=0;
h.push(make_pair(0,x));
while(!h.empty())
{
curent=h.top().second;
val=h.top().first;
h.pop();
for(i=0;i<a[curent].size();++i)
{
vecin=a[curent][i].second;
muchie=a[curent][i].first;
if(muchie+val<cost[vecin])
{
cost[vecin]=muchie+val;
dad[vecin]=curent;
h.push(make_pair(cost[vecin],vecin));
}
}
}
}
void v_r_fight()
{
int i,j,te=0,k,noduri[10];
vector<pair<int,int> > b[50];
for(i=1;i<=n;++i)
for(j=0;j<=a[i].size();++j)
b[i].push_back(a[i][j]);
for(i=1;i<=t;++i)
noduri[i]=sp[prm[i]];
for(i=1;i<t;++i)
{
for(j=1;j<=n;++j)
if(hue[j])
for(k=0;k<a[j].size();++k)
if(hue[a[i][j].second])// GET 666666
a[i][j].first=0;
hue[noduri[i]]=1;
dijkstra(noduri[i]);
te+=cost[noduri[i+1]];
update(noduri[i+1],noduri[i]);
}
for(i=1;i<=n;++i)
hue[i]=dad[i]=0;
for(i=1;i<=n;++i)
for(j=0;j<=a[i].size();++j)
a[i][j]=b[i][j];
sol=min(sol,te);
}
void solve(int k)
{
int i;
if(k==t+1)
{
v_r_fight();
return;
}
for(i=1;i<=t;++i)
if(!inprm[i])
{
prm[k]=i;
inprm[i]=1;
solve(k+1);
inprm[i]=0;
}
}
void write()
{
assert(freopen("subarbore.out","w",stdout)!=NULL);
printf("%d",sol);
}
int main()
{
read();
solve(1);
write();
return 0;
}