#include<bits/stdc++.h>
using namespace std;
int n, m;
struct node{
int u, d;
node(int _u, int _d){
u = _u;
d = _d;
}
bool operator < (const node &x) const{
return d > x.d;
}
};
struct edge{
int v, w;
edge(int _v, int _w){
v = _v;
w = _w;
}
};
vector<edge> g[2000010];
priority_queue<node> q;
long long dis[2000010];
int vis[2000010];
void dijkstra(){
for (int i = 0; i < 2000010; i++){
dis[i] = 1e10;
}
dis[0] = 0;
q.push(node(0, 0));
while(!q.empty()){
int u = q.top().u;
int d = q.top().d;
q.pop();
if(vis[u])continue;
vis[u] = 1;
for (int i = 0; i < g[u].size(); i++){
int v = g[u][i].v;
int w = g[u][i].w;
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
q.push(node(v, dis[v]));
}
}
}
}
int main(){
int z = 1;
while(true){
cin >> n >> m;
if(n == 0 && m == 0){
break;
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m - 1; j++){
int a;
cin >> a;
if (i == 0){
g[(n - 1) * (m - 1) * 2 + 1].push_back(edge(2 * j + 1, a));
g[2 * j + 1].push_back(edge((n - 1) * (m - 1) * 2 + 1, a));
} else {
if(i == n - 1){
g[0].push_back(edge(2 * (n - 2) * (m - 1) + 2 * j + 2, a));
g[2 * (n - 2) * (m - 1) + 2 * j + 2].push_back(edge(0, a));
} else {
g[2 * j + 1 + i * (m - 1) * 2].push_back(edge(2 * j + 1 + (i - 1) * (m - 1) * 2 + 1, a));
g[2 * j + 1 + (i - 1) * (m - 1) * 2 + 1].push_back(edge(2 * j + 1 + i * (m - 1) * 2, a));
}
}
}
}
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < m; j++){
int a;
cin >> a;
if(j == 0){
g[0].push_back(edge(2 + 2 * i * (m - 1), a));
g[2 + 2 * i * (m - 1)].push_back(edge(0, a));
} else {
if(j == m - 1){
g[(n - 1) * (m - 1) * 2 + 1].push_back(edge(2 * j - 1 + 2 * i * (m - 1), a));
g[2 * j - 1 + 2 * i * (m - 1)].push_back(edge((n - 1) * (m - 1) * 2 + 1, a));
} else {
g[2 * j - 1 + i * (m - 1) * 2].push_back(edge(2 * j + 2 + i * (m - 1) * 2, a));
g[2 * j + 2 + i * (m - 1) * 2].push_back(edge(2 * j - 1 + i * (m - 1) * 2, a));
}
}
}
}
for (int i = 0; i < n - 1; i++){
for (int j = 0; j < m - 1; j++){
int a;
cin >> a;
g[2 * j + 2 + i * (m - 1) * 2].push_back(edge(2 * j + 1 + i * (m - 1) * 2, a));
g[2 * j + 1 + i * (m - 1) * 2].push_back(edge(2 * j + 2 + i * (m - 1) * 2, a));
}
}
dijkstra();
cout << "Case "<< z << ": Minimum = " << dis[(n - 1) * (m - 1) * 2 + 1] << endl;
z++;
}
return 0;
}