#include <iostream>
#include <queue>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
double valor[60+60][60+60];
int cap[60+60][60+60], orCap[60+60][60+60];
bool vis[60+60];
int P[60+60];
vector<vector<int > > g1, g2;
int n, m;
bool bfs(vector<vector<int> > g)
{
queue<int> q;
q.push(0);
memset(vis, false, sizeof(vis));
memset(P, -1, sizeof(P));
vis[0] = true;
while (q.empty() == false)
{
int v = q.front();
q.pop();
for (int i = 0; i < g[v].size(); i++)
{
int u = g[v][i];
if (cap[v][u] > 0 && !vis[u])
{
vis[u] = true;
q.push(u);
P[u] = v;
}
}
}
if (vis[n+m+1]) return true;
return false;
}
double addFlow()
{
int v = n + m + 1;
int minCap = (1<<30);
while (P[v] != -1)
{
minCap = min(minCap, cap[ P[v] ][v]);
v = P[v];
}
v = n + m + 1;
double res = 0;
while (P[v] != -1)
{
int u = P[v];
cap[u][v] -= minCap;
cap[v][u] += minCap;
res += valor[u][v] * (double)minCap;
v = u;
}
return res;
}
int main()
{
int T = 0;
while (cin>>n>>m)
{
T++;
if (n + m == 0) break;
g1.clear();
g2.clear();
g1.resize(60+60);
g2.resize(60+60);
memset(cap, 0, sizeof(cap));
memset(orCap, 0, sizeof(orCap));
for (int i = 0; i < 60+60; i++)
{
for (int j = 0; j < 60+60; j++)
{
valor[i][j] = 0;
}
}
for (int i = 1; i <= n; i++)
{
cin>>cap[0][i];
}
for (int i = 1; i <= m; i++)
{
cin>>cap[n+i][n+m+1];
}
for (int i = 0; i < 60+60; i++)
{
for (int j = 0; j < 60+60; j++)
{
orCap[i][j] = cap[i][j];;
}
}
for (int i = 1; i <= m; i++)
{
g1[n+i].push_back(n+m+1);
g2[n+i].push_back(n+m+1);
}
for (int i = 1; i <= n; i++)
{
g1[0].push_back(i);
g2[0].push_back(i);
vector<pair<double, int> > v;
for (int j = 1; j <= m; j++)
{
cin>>valor[i][n+j];
v.push_back( make_pair( valor[i][n+j], n + j ) );
}
sort(v.begin(),v.end());
for (int j = 0; j < v.size(); j++)
{
if (v[j].first == -1) continue;
g1[i].push_back(v[j].second);
cap[i][v[j].second] = (1<<30);
}
//reverse(v.begin(), v.end());
for (int j = v.size()-1; j >= 0; j--)
{
if (v[j].first == -1) continue;
g2[i].push_back(v[j].second);
}
}
double f1 = 0, f2 = 0;
while (bfs(g1))
{
f1 += addFlow();
//cout<<f1<<endl;
}
for (int i = 0; i < 60+60; i++)
{
for (int j = 0; j < 60+60; j++)
{
cap[i][j] = orCap[i][j];
}
}
while (bfs(g2))
{
f2 += addFlow();
cout<<"adsfsdfsa"<<endl;
}
cout<<"Problem "<<T<<": "<<f1<<" to "<<f2<<endl;;
}
return 0;
}