#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (1LL<<62);
// Tính chi phí cho mỗi vị trí bắt đầu t=1..N để gom K học sinh (pos) vào K vị trí liên tiếp t..t+K-1
// Trả về vector size N: cost[t-1]
vector<ll> compute_costs_fast(int N, int K, vector<int>& pos) {
if (K == 0) return vector<ll>(N, 0);
vector<int> P = pos;
sort(P.begin(), P.end());
// A: nhân đôi
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
vector<ll> pref(2*K+1, 0);
for (int i = 0; i < 2*K; ++i) pref[i+1] = pref[i] + D[i];
// Precompute medians for windows idx=0..K-1
// median of D[l..r-1] where l=idx, r=idx+K: choose lower median at position l + (K-1)/2
vector<ll> med_idx(K);
int midOff = (K-1)/2;
for (int idx = 0; idx < K; ++idx) {
ll medD = D[idx + midOff];
med_idx[idx] = medD + idx; // median of (D_j + idx)
}
vector<ll> cost(N, INF);
// For each t, binary search med_idx to get 1 or 2 candidate windows
for (int t = 1; t <= N; ++t) {
int pos = (int)(lower_bound(med_idx.begin(), med_idx.end(), (ll)t) - med_idx.begin());
// check pos and pos-1
for (int cand = pos-1; cand <= pos; ++cand) {
if (cand < 0 || cand >= K) continue;
int l = cand, r = cand + K; // D[l..r-1]
ll val = (ll)t - (ll)cand; // want sum |D - val|
// count m = number of 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 0-based
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];
// compute costs
vector<ll> costP = compute_costs_fast(N, M, P);
vector<ll> costQ = compute_costs_fast(N, L, Q);
// duplicate costQ to handle circular interval selection
vector<ll> costQ2(2*N);
for (int i = 0; i < 2*N; ++i) costQ2[i] = costQ[i % N];
SparseTable st(costQ2);
ll ans = INF;
// try each start t1 for P block (1..N)
for (int t1 = 1; t1 <= N; ++t1) {
// Q block starts must be in [t1+M .. t1 + N - L] (1-based)
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;
}