#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
/*
理解题意很重要, 一次从0 点开始到i, 破坏一个电站, 再从0 开始到j 破坏第二个,
思路; 最段路径 + 01 背包;
*/
const int M = 105;
const int N = 10005;
const int MAX = 999999;
int dist[M];
int cost[M];
int weight[M];
int mmap[M][M];
int dp[N];
int T, n, m;
int sum, s;
void init() {
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= n; j++) {
mmap[i][j] = MAX;
}
}
}
void floyd(int n) {
for(int k = 0; k <= n; k++) {
for(int i = 0; i <= n; i++) {
for(int j = 0; j <= n; j++) {
mmap[i][j] = min(mmap[i][j], mmap[i][k] + mmap[k][j]);
}
}
}
}
void zeroPake(int s, int n) {
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++) {
for(int j = s; j >= cost[i]; j--) {
dp[j] = max(dp[j], dp[j - cost[i]] + weight[i]);
}
}
}
int main()
{
int x, y, d;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
init();
for(int i = 0; i < m; i++) {
scanf("%d%d%d", &x, &y, &d);
if(mmap[x][y] > d) {
mmap[x][y] = mmap[y][x] = d;
}
}
sum = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &weight[i]);
sum += weight[i];
}
sum = (sum>>1) + 1;
floyd(n);
s = 0;
for(int i = 1; i <= n; i++) {
cost[i] = mmap[0][i];
if(cost[i] != MAX) {
s += cost[i];
}
}
zeroPake(s, n);
int flag = 0;
for(int i = 1; i <= s; i++) {
if(dp[i] >= sum) {
flag = 1;
printf("%d\n", i);
break;
}
}
if(!flag)
printf("impossible\n");
}
return 0;
}