#include <bits/stdc++.h>

#define ll long long 
#define pii pair<int, int>
#define ull unsigned ll
#define f first
#define s second
#define FOR(i,a,b) for (int i=(a); i<(b); i++)
#define REP(i,n) for (int i=0; i<(n); i++)
#define RREP(i,n) for (int i=(n-1); i>=0; i--)
#define ALL(x) x.begin(),x.end()
#define SZ(x) (int)x.size()
#define SQ(x) (x)*(x)
#define MN(a,b) a = min(a,(__typeof__(a))(b))
#define MX(a,b) a = max(a,(__typeof__(a))(b))
#define pb push_back
#define SORT_UNIQUE(c) (sort(c.begin(),c.end()), c.resize(distance(c.begin(),unique(c.begin(),c.end()))))
#define bug(x) cerr<<#x<<" is "<<x<<endl

using namespace std;

#define int ll

const int iinf = 1<<29;
const ll inf = 1ll<<60;
const ll mod = 1e9+7;


void GG(){cout<<"Impossible\n"; exit(0);}

ll mpow(ll a, ll n, ll mo = mod){ // a^n % mod
    ll re=1;
    while (n>0){
        if (n&1) re = re*a %mo;
        a = a*a %mo;
        n>>=1;
    }
    return re;
}

ll inv (ll b, ll mo = mod){
    if (b==1) return b;
    return (mo-mo/b) * inv(mo%b) % mo;
}

const int maxn = 1e5+5;

ll gcd(ll a, ll b){
    if (b==0) return a;
    return gcd(b,a%b);
}



main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    
    int n, m; cin>>n>>m;
    vector<int> e, o;
    REP(i,m){
        int x; cin>>x; if (x&1)o.pb(x); else e.pb(x);
    }
    if (SZ(o)>2) GG();
    vector<int> re;
    vector<int> mo;
    if (SZ(o)) mo.pb(o[0]);
    mo.insert(mo.end(),ALL(e));
    if (SZ(o)>1) mo.pb(o[1]);
    REP(i, SZ(mo)){
        if (i==0) {if (mo[i]!=1) re.pb(mo[i]-1);}
        else if (i==SZ(mo)-1){
            re.pb(mo[i]+1);
        } else re.pb(mo[i]);
    }
    int s = 0; REP(i, SZ(re)) s += re[i];
    if (s!=n) re.pb(n-s);
    REP(i, SZ(mo)) cout<<mo[i]<<' '; cout<<endl;
    cout<<SZ(re)<<endl;
     REP(i, SZ(re)) s+=re[i],cout<<re[i]<<' ';
} 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[100005];
int main()
{
	scanf("%d%d",&n,&m);
	int ct=0;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]%2) ct++;
	}
	if(ct>2)
	{
		printf("Impossible\n");
		return 0;
	}
	int id1=0,id2=0;
	for(int i=1;i<=m;i++)
		if(a[i]%2)
		{
			if(!id1) id1=i;
			else if(!id2) id2=i;
		}
	if(id1)
	{
		if(id2==1) id2=id1;
		swap(a[1],a[id1]);
	}
	if(id2) swap(a[m],a[id2]);
	if(m==1)
	{
		if(a[1]==1) printf("1\n1\n1\n");
		else printf("%d\n2\n%d 1\n",a[1],a[1]-1);
		return 0;
	}
	if(!id2)
	{
		for(int i=1;i<=m;i++)
			printf("%d ",a[i]);
		printf("\n%d\n",m);
		for(int i=1;i<=m;i++)
		{
			if(i==1) printf("%d ",a[i]+1);
			else if(i==m) printf("%d ",a[i]-1);
			else printf("%d ",a[i]);
		}
		return 0;
	}
	if(n==2&&m==2)
	{
		printf("1 1\n1\n2\n");
		return 0;
	}
	if(n==4&&m==3)
	{
		printf("1 2 1\n2\n2 2\n");
		return 0;
	}
	if(a[1]==1&&a[m]==1)
	{
		for(int i=1;i<=m;i++)
			printf("%d ",a[i]);
		printf("\n%d\n",m-1);
		for(int i=2;i<=m;i++)
		{
			if(i==m) printf("%d ",a[i]+1);
			else printf("%d ",a[i]);
		}
		return 0;
	}
	for(int i=1;i<=m;i++)
		printf("%d ",a[i]);
	printf("\n%d\n",m);
	for(int i=1;i<=m;i++)
	{
		if(i==1) printf("%d ",a[i]+1);
		else if(i==m) printf("%d ",a[i]-1);
		else printf("%d ",a[i]);
	}
	return 0;
}