#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=0,f=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return f?-x:x;
}
const int inf = 0x3f3f3f3f;
const int N = 2010;
int n,m,head[N],cnt,S,T;
struct edge{int cap,flow,nxt,to,w;}e[N];
void add(int x,int y,int c,int f,int w)
{
e[++cnt].flow = f;e[cnt].cap = c;
e[cnt].to = y;e[cnt].nxt = head[x];e[cnt].w = w;
head[x] = cnt;
}
int cost;
int lastedge[N],lastnode[N],a[N],dis[N],vis[N];
bool bfs(int s,int t,int opt)
{
memset(dis,inf,sizeof(dis));
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
deque<int> que;
a[s] = inf;dis[s] = 0;lastnode[s] = -1;vis[s] = 1;
que.push_back(s);
while(que.size())
{
int x = que.front();
que.pop_front();
vis[x] = 0;
for(int i = head[x];~i;i = e[i].nxt)
{
if(e[i].cap > e[i].flow)
{
int y = e[i].to;
if(dis[y] > dis[x] + e[i].w)
{
lastnode[y] = x;
lastedge[y] = i;
dis[y] = dis[x] + e[i].w;
a[y] = min(e[i].cap - e[i].flow,a[x]);
if(vis[y]) continue;
vis[y] = 1;
if(que.size())
{
if(dis[y] < dis[que.front()])
que.push_front(y);
else que.push_back(y);
}
else que.push_back(y);
}
}
}
}
return a[t] > 0;
}
int S_m[N],n_T[N],m_n[N][N];
int EK(int s,int t,int opt)
{
memset(head,-1,sizeof(head));
cnt = -1;
for(int i = 1;i <= m;i++)
{
int cap = S_m[i];
add(s,i,cap,0,0);
add(i,s,0,0,0);
}
for(int i = 1+m;i <= n+m;i++)
{
int cap = n_T[i];
add(i,t,cap,0,0);
add(t,i,0,0,0);
}
for(int i = 1;i <= m;i++)
{
for(int j = 1+m;j <= n+m;j++)
{
int w = m_n[i][j];
add(i,j,inf,0,w*opt);
add(j,i,0,0,-w*opt);
}
}
cost = 0;
while(bfs(s,t,opt))
{
cost += opt*dis[t]*a[t];
int u = t;
while(u != s)
{
e[lastedge[u]].flow += a[t];
e[lastedge[u]^1].flow -= a[t];
u = lastnode[u];
}
cout<<"opt:: "<<opt<<" maxflow:: "<<a[t]<<endl;
}
return cost;
}
int main()
{
n = read();m = read();
S = n+m+9;
T = n+m+10;
for(int i = 1;i <= m;i++) S_m[i] = read();
for(int i = m+1;i <= m+n;i++) n_T[i] = read();
for(int i = 1;i <= m;i++)
for(int j = m+1;j <= n+m;j++) m_n[i][j] = read();
int ans_min = EK(S,T,1);
int ans_max = EK(S,T,-1);
cout<<ans_min<<endl<<ans_max<<endl;
return 0;
}