#include <stdio.h>
#include <string.h>
const int oo = 1073741819;
int m1, i, n, ans = oo, m, j, k, mid, a[801][801], x, y, z, cost[801], pl, l[804], r[804], s1, s2, l1[803], r1[803];
int main()
{
freopen("dragon.in", "r", stdin);
freopen("dragon.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i <= m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
a[x][y] += z, a[y][x] += z;
}
s1 = n + 1, s2 = n + 2;
for (i = 1; i <= n; ++i)
r[i] = i + 1, l[i + 1] = i;
l[1] = s1, r[s1] = 1;
for (i = 1; i < n; ++i)
{
memset(cost, 0, sizeof(cost));
for (j = r[s1]; j != s1; j = r[j])
l1[j] = l[j], r1[j] = r[j];
l1[s1] = l[s1], r1[s1] = r[s1];
for (j = 1; j <= n - i; ++j)
{
mid = 0; cost[0] = -oo;
for (k = r1[s1]; k != s1; k = r1[k])
if (cost[k] > cost[mid]) mid = k;
r1[l1[mid]] = r1[mid], l1[r1[mid]] = l1[mid];
for (k = r1[s1]; k != s1; k = r1[k])
cost[k] += a[mid][k];
}
k = r1[s1];
if (cost[k] < ans) ans = cost[k];
r[l[k]] = r[k], l[r[k]] = l[k];
for (j = r[s1]; j != s1; j = r[j])
a[mid][j] += a[k][j], a[j][mid] = a[mid][j];
}
scanf("%d", &pl);
for (i = 1; i <= pl; ++i) scanf("%d", &cost[i]);
mid = oo;
for (i = 1; i < pl; ++i)
for (j = i + 1; j <= pl; ++j)
if ((cost[i] ^ cost[j]) < mid)
mid = cost[i] ^ cost[j];
printf("%d\n", mid * ans);
return 0;
}
#include <string.h>
const int oo = 1073741819;
int m1, i, n, ans = oo, m, j, k, mid, a[801][801], x, y, z, cost[801], pl, l[804], r[804], s1, s2, l1[803], r1[803];
int main()
{
freopen("dragon.in", "r", stdin);
freopen("dragon.out", "w", stdout);
scanf("%d%d", &n, &m);
for (i = 1; i <= m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
a[x][y] += z, a[y][x] += z;
}
s1 = n + 1, s2 = n + 2;
for (i = 1; i <= n; ++i)
r[i] = i + 1, l[i + 1] = i;
l[1] = s1, r[s1] = 1;
for (i = 1; i < n; ++i)
{
memset(cost, 0, sizeof(cost));
for (j = r[s1]; j != s1; j = r[j])
l1[j] = l[j], r1[j] = r[j];
l1[s1] = l[s1], r1[s1] = r[s1];
for (j = 1; j <= n - i; ++j)
{
mid = 0; cost[0] = -oo;
for (k = r1[s1]; k != s1; k = r1[k])
if (cost[k] > cost[mid]) mid = k;
r1[l1[mid]] = r1[mid], l1[r1[mid]] = l1[mid];
for (k = r1[s1]; k != s1; k = r1[k])
cost[k] += a[mid][k];
}
k = r1[s1];
if (cost[k] < ans) ans = cost[k];
r[l[k]] = r[k], l[r[k]] = l[k];
for (j = r[s1]; j != s1; j = r[j])
a[mid][j] += a[k][j], a[j][mid] = a[mid][j];
}
scanf("%d", &pl);
for (i = 1; i <= pl; ++i) scanf("%d", &cost[i]);
mid = oo;
for (i = 1; i < pl; ++i)
for (j = i + 1; j <= pl; ++j)
if ((cost[i] ^ cost[j]) < mid)
mid = cost[i] ^ cost[j];
printf("%d\n", mid * ans);
return 0;
}