#include <bits/stdc++.h>
using namespace std;
const int INF=1e9;
const int MOD=1e9+7;
//const int MOD=998244353;
const long long LINF=1e18;
#define int long long
//template
/*
問題の言い換え
//0の行き先が0じゃなかったら0にしてans++;
0を根とする根付き木を考える
各部分根付き木の深さが(根の深さを0として）K以下になるように分解するとき最小でいくつに分解しないといけないか
これは葉から決めていけばよさそう
*/
//main
signed main(){
  int N,K,ans=0;cin>>N>>K;
  std::vector<int> v(N),in(N,0),depth(N,1);;
  for(int i=0;i<N;i++)cin>>v[i],v[i]--;
  if(v[0])ans++;v[0]=0;
  for(int i=0;i<N;i++)in[v[i]]++;
  queue<int> que;
  for(int i=0;i<N;i++)if(!in[i])que.push(i);
  while(que.size()){
    int p=que.front();que.pop();if(p==0)continue;
    if(depth[p]==K&&v[p])depth[p]=0,ans++;
    depth[v[p]]=max(depth[v[p]],depth[p]+1);
    if(!--in[v[p]])que.push(v[p]);
  }
  cout<<ans<<endl;
}

#include <iostream>
#include <algorithm>
using namespace std;

int A[110], ans[110];

int main() {
	int N, M;
	cin >> N >> M;
	int cnt=0;
	for(int i=0; i<M; ++i){
		cin >> A[i];
		cnt += A[i]%2;
	}
	if(cnt>2){
		cout << "Impossible" << endl;
		return 0;
	}
	if(cnt>0){
		bool flag=false;
		for(int i=0; i<M; ++i){
			if(A[i]%2==1){
				if(flag){
					swap(A[i], A[M-1]);
				}else{
					swap(A[i], A[0]);
					flag=true;
				}
			}
		}
	}
	cout << A[0];
	for(int i=1; i<M; ++i) cout << ' ' << A[i];
	cout << endl;
	int bs=0;
	if(A[0]>1){
		ans[bs]=A[0]-1;
		++bs;
	}
	A[0]=2;
	for(int i=0; i<M-1; ++i){
		ans[bs]=A[i];
		++bs;
	}
	if(A[M-1]>1){
		ans[bs]=A[M-1]-1;
		++bs;
	}
	cout << bs << endl;
	cout << ans[0];
	for(int i=1; i<bs; ++i) cout << ' ' << ans[i];
	cout << endl;
	return 0;
}