#include <iostream>#include <cstring>#include <cstdio>#include <queue>#define REP(A,X) for(int A=0;A<X;A++)using namespace std;#define INF 0x7fffffff#define MAXN 10010struct node{ int v,d,next;}edge[MAXN];int head[110];int inihead[110];int e=0;void init(){ e=0; REP(i,110)head[i]=-1;}void add_edge(int u,int v,int d){ edge[e].v=v; edge[e].d=d; edge[e].next=head[u]; head[u]=e; e++;}int dis[MAXN];int vis[MAXN];int cnt[MAXN];int r[MAXN];int num[MAXN];int spfa(int mid){ REP(i,25)vis[i]=0; REP(i,25)dis[i]=-INF; REP(i,25)cnt[i]=0; queue<int>q; q.push(0); vis[0]=1; cnt[0]++; dis[0]=0; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=head[x];i!=-1;i=edge[i].next) { int y=edge[i].v; int d=edge[i].d; if(dis[y]<dis[x]+d) { dis[y]=dis[x]+d; if(!vis[y]) { q.push(y); vis[y]=1; cnt[y]++; if(cnt[y]>25)return false; } } } vis[x]=0; } return 1;}int main(){ ios::sync_with_stdio(false); int t; scanf("%d",&t); while(t--) { REP(i,24)scanf("%d",&r[i+1]); int n; int a; scanf("%d",&n); REP(i,25)num[i+1]=0; REP(i,n){ scanf("%d",&a); num[a+1]++; } init(); for(int i=1;i<=24;i++){ if(i>7)add_edge(i-8,i,r[i]); add_edge(i,i-1,-num[i]); add_edge(i-1,i,0); } int tempe=e; REP(i,25)inihead[i]=head[i]; int x=0,y=n; int ans=INF; while(x<y) { e=tempe; int mid=(x+y)/2; REP(i,25) head[i]=inihead[i]; for(int i=1;i<8;i++) add_edge(i+16,i,r[i]-mid); add_edge(0,24,mid); if(spfa(mid)){ y=mid; ans=min(mid,ans); } else{ x=mid+1; } } if(ans>n)printf("No Solutionn"); else printf("%dn",ans); } return 0;}