#include <bits/stdc++.h>
#define int long long
using namespace std;
int dx[4] = {1, 0, 0, -1},
dy[4] = {0, 1, -1, 0};
int n, m, Q, dis[155][20005], vis[20005], x1[100005], x2[100005], y1[100005], y2[100005], R[20005][5], ans[100005];
vector < int > v;
struct node
{
int x, y, w;
bool operator < (const node &a) const
{
return w > a.w;
}
};
priority_queue < node > q;
int id(int x, int y)
{
return (x - 1) * m + y;
}
void dijkstra1(int x, int y, int l, int r)
{
for (int i = 1; i <= n; i++)
for (int j = l; j <= r; j++)
dis[x][id(i, j)] = 1145141919;
for (int i = 1; i <= n; i++)
for (int j = l; j <= r; j++)
vis[id(i, j)] = 0;
dis[x][id(x, y)] = 0;
q.push({x, y, 0});
while (!q.empty())
{
node t = q.top();
q.pop();
if (vis[id(t.x, t.y)]) continue;
vis[id(t.x, t.y)] = 1;
for (int i = 0; i < 4; i++)
{
int tx = t.x + dx[i], ty = t.y + dy[i];
if (tx > 0 && tx <= n && ty >= l && ty <= r)
{
if (dis[x][id(tx, ty)] > dis[x][id(t.x, t.y)] + R[id(t.x, t.y)][i])
{
dis[x][id(tx, ty)] = dis[x][id(t.x, t.y)] + R[id(t.x, t.y)][i];
q.push({tx, ty, dis[x][id(tx, ty)]});
}
}
}
}
}
void dijkstra2(int x, int y, int l, int r)
{
for (int i = l; i <= r; i++)
for (int j = 1; j <= m; j++)
dis[y][id(i, j)] = 1145141919;
for (int i = l; i <= r; i++)
for (int j = 1; j <= m; j++)
vis[id(i, j)] = 0;
dis[y][id(x, y)] = 0;
q.push({x, y, 0});
while (!q.empty())
{
node t = q.top();
q.pop();
if (vis[id(t.x, t.y)]) continue;
vis[id(t.x, t.y)] = 1;
for (int i = 0; i < 4; i++)
{
int tx = t.x + dx[i], ty = t.y + dy[i];
if (tx >= l && tx <= r && ty > 0 && ty <= m)
{
if (dis[y][id(tx, ty)] > dis[y][id(t.x, t.y)] + R[id(t.x, t.y)][i])
{
dis[y][id(tx, ty)] = dis[y][id(t.x, t.y)] + R[id(t.x, t.y)][i];
q.push({tx, ty, dis[y][id(tx, ty)]});
}
}
}
}
}
void doit1(vector < int > fac, int l, int r)
{
if (l > r) return;
if (!fac.size()) return;
int mid = (l + r) / 2;
for (int i = 1; i <= n; i++)
dijkstra1(i, mid, l, r);
vector < int > facl, facr;
for (int i = 0; i < fac.size(); i++)
{
int t = fac[i];
for (int j = 1; j <= n; j++)
ans[t] = min(ans[t], dis[j][id(x1[t], y1[t])] + dis[j][id(x2[t], y2[t])]);
if (y1[t] <= mid && y2[t] <= mid) facl.push_back(t);
else if (y1[t] > mid && y2[t] > mid) facr.push_back(t);
}
doit1(facl, l, mid);
doit1(facr, mid + 1, r);
}
void doit2(vector < int > fac, int l, int r)
{
if (l > r) return;
if (!fac.size()) return;
int mid = (l + r) / 2;
for (int i = 1; i <= m; i++)
dijkstra2(mid, i, l, r);
vector < int > facl, facr;
for (int i = 0; i < fac.size(); i++)
{
int t = fac[i];
for (int j = 1; j <= m; j++)
ans[t] = min(ans[t], dis[j][id(x1[t], y1[t])] + dis[j][id(x2[t], y2[t])]);
if (x1[t] <= mid && x2[t] <= mid) facl.push_back(t);
else if (x1[t] > mid && x2[t] > mid) facr.push_back(t);
}
doit2(facl, l, mid);
doit2(facr, mid + 1, r);
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j < m; j++)
{
cin >> R[id(i, j)][1];
R[id(i, j + 1)][2] = R[id(i, j)][1];
}
for (int i = 1; i < n; i++)
for (int j = 1; j <= m; j++)
{
cin >> R[id(i, j)][0];
R[id(i + 1, j)][3] = R[id(i, j)][0];
}
cin >> Q;
for (int i = 1; i <= Q; i++)
ans[i] = 1145141919;
for (int i = 1; i <= Q; i++)
cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];
for (int i = 1; i <= Q; i++)
v.push_back(i);
if (n < m) doit1(v, 1, m);
else doit2(v, 1, n);
for (int i = 1; i <= Q; i++)
cout << ans[i] << endl;
return 0;
}