#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (1LL<<62);
// Tính cost[t-1] = minimal total steps để đưa tất cả K học sinh (pos) vào các vị trí t..t+K-1
// Xử lý bằng cách nhân đôi mảng pos và thử mọi rotation idx (chọn K học sinh liên tiếp bắt đầu từ idx)
vector<ll> compute_costs_bruteforce(int N, int K, vector<int>& pos) {
if (K == 0) return vector<ll>(N, 0);
vector<int> P = pos;
sort(P.begin(), P.end());
vector<int> A(2*K);
for (int i = 0; i < K; ++i) {
A[i] = P[i];
A[i+K] = P[i] + N;
}
// D[k] = A[k] - k
vector<ll> D(2*K);
for (int k = 0; k < 2*K; ++k) D[k] = (ll)A[k] - (ll)k;
// prefix sums of D
vector<ll> pref(2*K+1, 0);
for (int i = 0; i < 2*K; ++i) pref[i+1] = pref[i] + D[i];
vector<ll> cost(N, INF);
// với mỗi start t (1..N)
for (int t = 1; t <= N; ++t) {
// thử mọi rotation idx = 0..K (tức chọn K học sinh A[idx..idx+K-1])
// val = t - idx
for (int idx = 0; idx <= K; ++idx) {
int l = idx, r = idx + K; // đoạn trên D: [l, r)
// val
ll val = (ll)t - (ll)idx;
// tìm số phần tử trong D[l..r-1] <= val
int m = (int)(upper_bound(D.begin()+l, D.begin()+r, val) - (D.begin()+l));
ll sumLeft = val * (ll)m - (pref[l+m] - pref[l]);
ll sumRight = (pref[r] - pref[l+m]) - val * (ll)(K - m);
ll cur = sumLeft + sumRight;
if (cur < cost[t-1]) cost[t-1] = cur;
}
}
return cost;
}
// Sparse table cho RMQ (min)
struct SparseTable {
int n, LOG;
vector<vector<ll>> st;
vector<int> lg;
SparseTable() {}
SparseTable(const vector<ll>& a) {
n = (int)a.size();
lg.assign(n+1, 0);
for (int i=2;i<=n;++i) lg[i] = lg[i>>1] + 1;
LOG = lg[n];
st.assign(LOG+1, vector<ll>(n));
st[0] = a;
for (int k = 1; k <= LOG; ++k) {
for (int i = 0; i + (1<<k) <= n; ++i) {
st[k][i] = min(st[k-1][i], st[k-1][i + (1<<(k-1))]);
}
}
}
ll range_min(int l, int r) { // inclusive
if (l > r) return INF;
int len = r - l + 1;
int k = lg[len];
return min(st[k][l], st[k][r - (1<<k) + 1]);
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
if (!(cin >> T)) return 0;
while (T--) {
int N, M, L;
cin >> N >> M >> L;
vector<int> P(M), Q(L);
for (int i = 0; i < M; ++i) cin >> P[i];
for (int i = 0; i < L; ++i) cin >> Q[i];
sort(P.begin(), P.end());
sort(Q.begin(), Q.end());
// dùng phiên bản sửa: đúng nhưng có thể chậm với dữ liệu cực lớn
vector<ll> costP = compute_costs_bruteforce(N, M, P);
vector<ll> costQ = compute_costs_bruteforce(N, L, Q);
// duplicate costQ để xử lý đoạn trên vòng tròn
vector<ll> costQ2(2*N);
for (int i = 0; i < 2*N; ++i) costQ2[i] = costQ[i % N];
SparseTable st(costQ2);
ll ans = INF;
for (int t1 = 1; t1 <= N; ++t1) {
int l = t1 + M;
int r = t1 + N - L;
int Lidx = l - 1;
int Ridx = r - 1;
if (Lidx < 0) Lidx = 0;
if (Ridx >= 2*N) Ridx = 2*N - 1;
if (Lidx <= Ridx) {
ll bestQ = st.range_min(Lidx, Ridx);
ans = min(ans, costP[t1-1] + bestQ);
}
}
cout << ans << "\n";
}
return 0;
}