/*
最大体积很显然
最小体积用贪心做的,如果横向和纵向的高度一样,那么这个位置的高度就固定了,最后如果一整行或一整列的高度都没固定,就找一个合适的位置固定。
*/
#include<cstdio>
#include<iostream>
#define N 1010
using namespace std;
int map[N][N],zhu[N],zuo[N],n,m;
int vzhu[N],vzuo[N];
void work1()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(zhu[i]==zuo[j]&&!vzhu[i]&&!vzuo[j])
{
map[i][j]=zhu[i];
vzhu[i]=1;vzuo[j]=1;
}
for(int i=1;i<=n;i++)
if(!vzhu[i])
{
for(int j=1;j<=m;j++)
if(zhu[i]<=zuo[j]&&!map[i][j])
{
map[i][j]=zhu[i];
if(zhu[i]==zuo[j])vzuo[j]=1;
break;
}
}
for(int j=1;j<=m;j++)
if(!vzuo[j])
{
for(int i=1;i<=n;i++)
if(zuo[j]<=zhu[i]&&!map[i][j])
{
map[i][j]=zuo[j];
break;
}
}
int tot=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
tot+=map[i][j];
printf("%d ",tot);
}
void work2()
{
int tot=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
tot+=min(zhu[i],zuo[j]);
printf("%d",tot);
}
int main()
{
//freopen("jh.in","r",stdin);
//freopen("neighbor.in","r",stdin);
//freopen("neighbor.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&zhu[i]);
for(int i=1;i<=m;i++)
scanf("%d",&zuo[i]);
work1();
work2();
return 0;
}