#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline int read(){
int f = 1, x = 0;char ch = getchar();
while (ch > '9' || ch < '0'){if (ch == '-')f = -f;ch = getchar();}
while (ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
return x * f;
}
const int maxn = 1e6 + 10;
struct node{
LL T,D;
bool operator < (const node & rhs) const{
return T > rhs.T;
}
};
LL t[maxn];
priority_queue<node> pq;
int main(){
//freopen("/Users/chutong/ACM/data.in","r",stdin);
//freopen("/Users/chutong/ACM/data.out","w",stdout);
int T = read(),kase = 1;
while(T--){
int L = read();
int n = read(), m = read();
while(!pq.empty()) pq.pop();
node now;
LL ans = 0;
for(int i=1; i<=n; i++){
now.T = now.D = read();
pq.push(now);
}
for(int i=1; i<=L; i++){
now = pq.top();
pq.pop();
t[i] = now.T;
now.T += now.D;
pq.push(now);
}
while(!pq.empty()) pq.pop();
for(int i=1; i<=m; i++){
now.T = now.D = read();
pq.push(now);
}
for(int i=L; i>=1; i--){
now = pq.top(); pq.pop();
ans = max(ans,t[i] + now.T);
now.T += now.D;
pq.push(now);
}
printf("Case #%d: %lld\n",kase++,ans);
}
return 0;
}