#include <bits/extc++.h>
#define endl '\n'
typedef long long ll;
#define int ll
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
struct ly {
int to, nxt, w;
} edge[1200001];
int he[400001], cnt, d[400001];
void add(int u, int v, int w) {
edge[++cnt] = {v, he[u], w};
he[u] = cnt;
}
bitset<400001> vis;
typedef pair<int, int> pll;
void dij(int s) {
memset(d, 0x3f, sizeof(d));
std::priority_queue<pll, vector<pll>, greater<pll>> q;
d[s] = 0;
q.push({d[s], s});
while (q.size()) {
int ds = q.top().first, u = q.top().second;
q.pop();
if (vis[u]) {
continue;
}
vis[u] = 1;
for (int i = he[u]; i; i = edge[i].nxt) {
int v = edge[i].to;
if (d[u] + edge[i].w < d[v]) {
d[v] = d[u] + edge[i].w;
q.push({d[v], v});
}
}
}
}
void Main() {
cnt = 0;
memset(he, 0, sizeof(he));
vis.reset();
int n, m, T, D;
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> T;
if (j < m) {
add(i * (m - 1) + j, i * (m - 1) + j + 1, T);
}
if (i < n) {
add(n * m + i * (m - 1) + j, n * m + (i + 1) * (m - 1) + j, T);
}
if (j > 1) {
add(2 * n * m + i * (m - 1) + j, 2 * n * m + i * (m - 1) + j - 1, T);
}
if (i > 1) {
add(3 * n * m + i * (m - 1) + j, 3 * n * m + (i - 1) * (m - 1) + j, T);
}
}
}
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> D;
for (int k = 0; k <= 3; ++k) {
for (int l = 0; l <= 3; ++l) {
add(k * n * m + i * (m - 1) + j, l * n * m + i * (m - 1) + j, D);
}
}
}
}
dij(1);
cout << d[2 * n * m] << endl;
}
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t;
cin >> t;
while (t--) {
Main();
}
return 0;
}
// DIJKSTRA