#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;
        }
    }
}
