#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int n,m,m1,l,cnt;
int a[maxn],s[maxn],pre[maxn];
struct node{
int x,pos;
}ans[maxn<<6];
inline void ipt(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
sort(a+1,a+n+1);
m1=m;
}
inline void init(){
for(int i=1;i<n;i++){
int u=a[i],v=a[i+1];
int p=(v-u-1)/2,q=(v-u-1)%2;
s[1]+=2;
if(p+1<=2e5)s[p+1]-=2;
if(p+1<=2e5)s[p+1]+=q;
if(p+2<=2e5)s[p+2]-=q;
}
s[1]+=2;
for(int i=1;i<=2e5;i++)pre[i]=pre[i-1]+s[i];
}
inline void solve1(){
int ans=0;
for(int i=1;i<=2e5;i++){
if(m>pre[i]){
m-=pre[i];
ans+=pre[i]*i;
}
else {
ans+=m*i;
l=i;
break;
}
}
printf("%lld\n",ans);
}
inline bool cmp(node nx,node ny){return nx.x<ny.x;}
inline void solve2(){
for(int i=1;i<n;i++){
int u=a[i],v=a[i+1],mx=u;
for(int j=u+1;j<=u+l&&j<v;j++){
ans[++cnt].pos=j;
ans[cnt].x=j-u;
mx=j;
}
for(int j=v-1;j>u&&j>=v-l&&j>mx;j--){
ans[++cnt].pos=j;
ans[cnt].x=v-j;
}
}
for(int i=1;i<=l;i++){
ans[++cnt].x=i;
ans[cnt].pos=a[1]-i;
ans[++cnt].x=i;
ans[cnt].pos=a[n]+i;
}
sort(ans+1,ans+cnt+1,cmp);
}
inline void output(){
for(int i=1;i<=m1;i++)printf("%lld ",ans[i].pos);
printf("\n");
}
signed main(){
ipt();
init();
solve1();
solve2();
output();
return 0;
}