#include<bits/stdc++.h>
#define ll long long
#define inf(x) (ll)(1e##x)
using namespace std;
template<typename tn> void read(tn &a){
	tn x=0,f=1; char c=' ';
	for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
	for(;isdigit(c);c=getchar()) x=x*10+c-'0';
	a=x*f;
}
int n,m;
vector<int> v[3];
int main(){
	read(n);read(m);
	for(int i=1;i<=m;i++){
		int x;read(x);
		v[x&1].push_back(x);
	}
	if(v[1].size()>2){puts("Impossible");return 0;}
	if(m==1){
		int p=v[0].size()?v[0][0]:v[1][0];
		cout<<p<<'\n';
		cout<<p/2+1<<'\n';
		if(p&1){
			for(int i=1;i<=p/2;i++) cout<<2<<' ';
			cout<<1<<'\n';
		}
		else{
			for(int i=1;i<=p/4;i++) cout<<2<<' ';
			cout<<1<<' ';
			for(int i=1;i<=(p-2)/4;i++) cout<<2<<' ';
			cout<<1<<'\n';
		}
		return 0;
	}
	if(v[1].size()) v[2].push_back(v[1][0]);
	for(int x:v[0]) v[2].push_back(x);
	if(v[1].size()>1) v[2].push_back(v[1][1]);
	for(int x:v[2]) cout<<x<<' ';cout<<'\n';
	cout<<v[2].size()-(v[2].back()==1)<<'\n';
	cout<<v[2][0]+1<<' ';
	for(int i=1;i+1<v[2].size();i++) cout<<v[2][i]<<' ';
	if(v[2].back()>1) cout<<v[2].back()-1<<'\n';
	return 0;
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

int sum, n;
int a[101], odd, evn, pos[101];
int b[101], cnt;

void work()
{
	if(n == 1)
	{
		if(a[1] == 1) b[++cnt] = 1;
		else b[++cnt] = 1, b[++cnt] = a[1] - 1;
		return;
	}
	if(a[1] & 1) b[++cnt] = a[1] + 1;
	else b[++cnt] = 1, b[++cnt] = a[1];
	for(int i=2; i<n; i++) b[++cnt] = a[i];
	if(a[n]==1) return;
	else b[++cnt] = a[n]-1;
}

int main()
{
	scanf("%d%d", &sum, &n);
	for(int i=1; i<=n; i++) scanf("%d", &a[i]);
	for(int i=1; i<=n; i++)
		if(a[i] & 1) pos[++odd] = i;
		else evn++;
	if(odd > 2) printf("Impossible\n"), exit(0);
	if(odd == 0) work();
	else if(odd == 1) swap(a[pos[1]], a[1]), work();
	else swap(a[pos[1]], a[1]), swap(a[pos[2]], a[n]), work();
	for(int i=1; i<=n; i++) printf("%d ", a[i]); putchar('\n');
	printf("%d\n", cnt);
	for(int i=1; i<=cnt; i++) printf("%d ", b[i]); putchar('\n');
	return 0;
}