#include <bits/stdc++.h>
using namespace std;
const int N = 1000 * 100 + 5;
long long poww(long long a, long long n) {
  if (n == 0) return 1;
  if (n == 1) return a % 1000000007;
  long long v = poww(a, n / 2);
  v = (v * v) % 1000000007;
  if (n % 2 == 1) return (v * a) % 1000000007;
  return v % 1000000007;
}
inline void getInt(int& x) {
  int c = getchar();
  x = 0;
  for (; (c < 48 || c > 57); c = getchar())
    ;
  for (; c > 47 && c < 58; c = getchar()) {
    x = (x << 1) + (x << 3) + c - 48;
  }
}
inline void out_d(int n) {
  if (n < 0) {
    n = -n;
    putchar('-');
  }
  int i = 10;
  char output_buffer[10];
  do {
    output_buffer[--i] = (n % 10) + '0';
    n /= 10;
  } while (n);
  do {
    putchar(output_buffer[i]);
  } while (++i < 10);
  putchar(' ');
}
priority_queue<pair<long long, long long> > q;
vector<int> v1, v2, v3;
int nop, non, f1, f2, f3, n, t;
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> t;
    if (t < 0 && f1 == 0) {
      v1.push_back(t);
      f1 = -1;
    } else if (t > 0 && f2 == 0) {
      v2.push_back(t);
      f2 = -1;
    } else {
      v3.push_back(t);
    }
  }
  if ((int)(v2.size()) == 0) {
    sort(v3.begin(), v3.end());
    v2.push_back(v3[0]);
    v2.push_back(v3[1]);
    cout << (int)(v1.size()) << " " << v1[0] << '\n';
    cout << (int)(v2.size()) << " " << v2[0] << " " << v2[1] << '\n';
    cout << (int)(v3.size()) - 2 << " ";
    for (int i = 2; i < (int)(v3.size()); i++) cout << v3[i] << " ";
  } else {
    cout << (int)(v1.size()) << " " << v1[0] << '\n';
    cout << (int)(v2.size()) << " " << v2[0] << '\n';
    cout << (int)(v3.size()) << " ";
    for (int i = 0; i < (int)(v3.size()); i++) cout << v3[i] << " ";
    ;
  }
  return 0;
}
