#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace std;
using namespace __gnu_pbds;
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
long long a[45];
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
if (!(cin >> n)) return 0;
for (int i = 0; i < n; i++) cin >> a[i];
gp_hash_table<long long, long long, custom_hash> mp;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
while (true) {
long long mask = rng() & ((1ULL << n) - 1);
if (mask == 0) continue;
long long sum = 0;
for (int i = 0; i < n; i++) {
if ((mask >> i) & 1) sum += a[i];
}
if (mp.find(sum) != mp.end()) {
long long m1 = mask;
long long m2 = mp[sum];
if (m1 != m2) {
long long c = m1 & m2;
m1 ^= c;
m2 ^= c;
vector<long long> v1, v2;
for (int i = 0; i < n; i++) {
if ((m1 >> i) & 1) v1.push_back(a[i]);
if ((m2 >> i) & 1) v2.push_back(a[i]);
}
cout << v1.size() << "\n";
for (int i = 0; i < v1.size(); i++) cout << v1[i] << (i + 1 == v1.size() ? "" : " ");
cout << "\n";
cout << v2.size() << "\n";
for (int i = 0; i < v2.size(); i++) cout << v2[i] << (i + 1 == v2.size() ? "" : " ");
cout << "\n";
return 0;
}
} else {
mp[sum] = mask;
}
}
}