#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, 0sizeof(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;
}