#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<cassert>
#include<cstdio>
#include<iomanip>
#include<queue>
#include<stack>
using namespace std;
const int maxn=111;
const int maxc=1001000;
const int inf=0x3f3f3f3f;
struct zz
{
int from;
int to;
int cost;
}zx,tz;
int T,n,m,sum,total,half,need;
vector<zz>g[maxn];
queue<int>q;
int get[maxn];
int power[maxn];
bool vis[maxn];
int can[maxc];
void spfa()
{
while(!q.empty())
{
q.pop();
}
for(int i=1;i<=n;i++)
{
get[i]=inf;
}
memset(vis,false,sizeof(vis));
q.push(0);
vis[0]=true;
get[0]=0;
power[0]=0;
int now;
int to;
int cost;
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<g[now].size();i++)
{
to = g[now][i].to;
cost = get[now] + g[now][i].cost;
if( cost < get[to] )
{
get[to]=cost;
if(!vis[to])
{
vis[to]=true;
q.push(to);
}
}
}
vis[now]=false;
}
sum=0;
total=0;
for(int i=1;i<=n;i++)
{
if(get[i]!=inf)
{
total+=power[i];
sum+=get[i];
}
}
return ;
}
bool disable()
{
if( total < half )
{
return false;
}
memset(can,0,sizeof(int)*(sum+maxn));
int temp;
for(int j=1;j<=n;j++)
{
for(int i=sum;i>=get[j];i--)
{
can[i]=max(can[i],can[i-get[j]] + power[j]);
}
}
for(int i=0;i<=sum;i++)
{
if(can[i] >=half)
{
need=i;
return true;
}
}
assert(false);
}
int main()
{
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=0;i<=n;i++)
{
g[i].clear();
}
for(int i=1;i<=m;i++)
{
cin>>zx.from>>zx.to>>zx.cost;
g[zx.from].push_back(zx);
swap(zx.from,zx.to);
g[zx.from].push_back(zx);
}
total=0;
for(int i=1;i<=n;i++)
{
cin>>power[i];
total+=power[i];
half=total/2;
half++;
}
spfa();
if(!disable())
{
cout<<"impossible"<<endl;
}
else
{
cout<<need<<endl;
}
}
return 0;
}