1 #include<cstdio>
2 #include<iostream>
3 #include<algorithm>
4 #include<cstring>
5 #include<queue>
6 using namespace std;
7 const int inf=0x3f3f3f3f;
8 queue<int>Q;
9 int n,m,dis[16][16],cnt,head[16],f[10000],g[1600005],t[16],mi[16],a[16],d[16];
10 struct edge { int to,from,v; }e[100];
11 void insert(int x,int y,int z) { e[++cnt].to=y; e[cnt].from=head[x]; e[cnt].v=z; head[x]=cnt; }
12 void floyd()
13 {
14 for (int k=1;k<=n;k++)
15 for (int i=1;i<=n;i++)
16 for (int j=1;j<=n;j++)
17 dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
18 }
19 void zy_dp()
20 {
21 memset(f,inf,sizeof(f));
22 f[0]=0;
23 for (int i=0;i<mi[n];i++)
24 for (int j=1;j<=n;j++)
25 if (!(i&mi[j-1]))
26 for (int k=j+1;k<=n;k++)
27 if (!(i&mi[k-1]))
28 f[i^mi[j-1]^mi[k-1]]=min(f[i]+dis[j][k],f[i^mi[j-1]^mi[k-1]]);
29 }
30 void dp()
31 {
32 memset(g,inf,sizeof(g));
33 g[2]=0; Q.push(2);
34 while (!Q.empty())
35 {
36 int u=Q.front(),tot=0; Q.pop();
37 for (int i=1;i<=n;i++) if (u/t[i-1]%3>0) a[++tot]=i;
38 for (int i=1;i<=n;i++)
39 if (u/t[i-1]%3==0)
40 {
41 for (int j=head[i];j;j=e[j].from)
42 if (u/t[e[j].to-1]%3>0)
43 {
44 int k=u+t[i-1]*2;
45 if (g[u]>=g[k]) continue;
46 if (g[k]==inf) Q.push(k);
47 g[k]=g[u];
48 }
49 for (int j=1;j<=tot;j++)
50 {
51 int k=u+t[i-1];
52 k+=(u/t[a[j]-1]%3==1)?t[a[j]-1]:-t[a[j]-1];
53 if (g[u]+dis[i][a[j]]>=g[k]) continue;
54 if (g[k]==inf) Q.push(k);
55 g[k]=g[u]+dis[i][a[j]];
56 }
57 }
58 }
59 }
60 void calc()
61 {
62 int ans=inf;
63 for (int i=0;i<t[n];i++)
64 {
65 int boo=0;
66 for (int j=1;j<=n;j++) if (head[j]&&!((i/t[j-1])%3)) { boo=1; break; }
67 if (boo) continue;
68 int k=i;
69 for (int j=1;j<=n;j++) if (d[j]%2==1) if (i/t[j-1]%3==1) k+=t[j-1]; else k-=t[j-1];
70 int w=0;
71 for (int j=1;j<=n;j++) if (k/t[j-1]%3==1) w^=mi[j-1];
72 ans=min(ans,g[i]+f[w]);
73 }
74 for (int i=1;i<=cnt;i+=2) ans+=e[i].v;
75 printf("%d",ans);
76 }
77 int main()
78 {
79 memset(dis,inf,sizeof(dis));
80 scanf("%d%d",&n,&m);
81 mi[0]=t[0]=1;
82 for (int i=1;i<=n;i++) mi[i]=mi[i-1]*2,t[i]=t[i-1]*3;
83 for (int i=1;i<=m;i++)
84 {
85 int x,y,z;
86 scanf("%d%d%d",&x,&y,&z);
87 dis[x][y]=dis[y][x]=min(dis[x][y],z);
88 d[x]++; d[y]++;
89 insert(x,y,z); insert(y,x,z);
90 }
91 scanf("%d",&m);
92 for (int i=1;i<=m;i++)
93 {
94 int x,y,z;
95 scanf("%d%d%d",&x,&y,&z);
96 dis[x][y]=dis[y][x]=min(dis[x][y],z);
97 }
98 floyd(); zy_dp(); dp(); calc();
99 return 0;
100 }