/*
num[i]表示每i时刻来的人数
x[i]表示i时刻取用的人数
r[i]表示i时刻需要的人数
①显然取用的人数应不大于来的人数,并且不小于0,所以0 <= x[i] <= num[i]
②因为可以服务于i时刻的是从i-7一直到i,所以x[i - 7] + x[i - 6] + ... + x[i] >= r[i]
这里求的是最小值,所以用最长路,为了得到需要的不等式形式,又看到条件②的形式,想到了前缀和,
用引入s[i]=x[1]+x[2]+...+x[i],所以:
①s[i]>=s[i - 1] + 0 , s[i - 1] >= s[i] - num[i];
②当i>=8时,s[i] - s[i - 8] >= r[i] -> s[i] >= s[i - 8] + r[i] ; 当0<i<=7 , s[i]+s[24]-s[i+16]>= r[i] -> s[i] >= s[i+16]-s[24]+r[i]
由①可知,0可以是超级源点
*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int N = 30 , M = 100;
int e[M] , ne[M] , w[M] , h[N] , idx;
bool st[N];
int dist[N] , cnt[N];
int r[N];
int num[N];
int s[N];
int n;
void add(int a , int b , int c)
{
e[idx] = b , ne[idx] = h[a] , w[idx] = c , h[a] = idx++;
}
void build(int c)
{
memset(h , -1 , sizeof h);
idx = 0;
for(int i = 1 ; i <= 24 ; i++)
{
add(i - 1 , i , 0);
add(i , i - 1 , -num[i]);
}
for(int i = 1 ; i <= 7 ; i++) add(i + 16 , i , r[i] - c);
for(int i = 8 ; i <= 24 ; i++) add(i - 8 , i , r[i]);
add(0 , 24 , c) , add(24 , 0 , -c);
}
bool spfa(int c)
{
build(c);
memset(cnt , 0 , sizeof cnt);
memset(st , 0 , sizeof st);
memset(dist , -0x3f , sizeof dist);
queue<int> q;
q.push(0);
dist[0] = 0;
st[0] = true;
while(q.size())
{
int t = q.front();
st[t] = false;
q.pop();
for(int i = h[t] ; ~i ; i = ne[i])
{
int j = e[i];
if(dist[j] < dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
cnt[j] = cnt[t] + 1;
if(cnt[j] == 25) return true;
if(!st[j])
{
st[j] = true;
q.push(j);
}
}
}
}
return false;
}
int main()
{
int T;
cin >> T;
while(T--)
{
for(int i = 1 ; i <= 24 ; i++) cin >> r[i];
cin >> n;
memset(num , 0 , sizeof num);
for(int i = 0 ; i < n ; i++)
{
int t;
cin >> t;
num[t + 1]++;
}
bool flag = false;
for(int i = 0 ; i <= 1000 ; i++)
{
if(!spfa(i))
{
cout << i << endl;
flag = true;
break;
}
}
if(!flag) puts("No Solution");
}
return 0;
}