#include <iostream>
 #include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>

using namespace std;
#define FOR(i,a,b) for(int i=a; i<=b; i++)
#define DOW(i,a,b) for(int i=a; i>=b; i--)
#define REP(i,n) for(int i=0; i < n; i++)
typedef long long int64;
const int days[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
const int nex[] = {0,2,3,4,5,6,7,8,9,10,11,12,1};
const int pre[] = {0,12,1,2,3,4,5,6,7,8,9,10,11};

int need[13][32];
int m, d, p, t, n;

int main() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    FOR(i,1,12)
     FOR(j,1,31)
       need[i][j] = 0;
    FOR(i,0,n-1)  {
       cin >> m >> d >> p >> t;
       FOR(j,1,t) {
          if (d == 1) {m = pre[m]; d = days[pre[m]];}
           else d = d - 1;
          need[m][d] += p;
//          cout << m << " " << d << " " << p << endl;
       }
    }
    int res = 0;
    FOR(i,1,12)
     FOR(j,1,31)
       if (need[i][j] > res) res = need[i][j];
    cout << res;
    //system("pause");
    return 0;
}


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <memory.h>
#include <sstream>
#include <complex>
#include <iomanip>

#define REP(i,n) for(int i = 0, _n = (n); i < _n; i++)
#define FOR(i,a,b) for (int i = (a), _b = (b); i <= _b; i++)
#define DOW(i,a,b) for (int i = (a), _b = (b); i >= _b; i--)

using namespace std;

const int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
const int pre[] = {0,12,1,2,3,4,5,6,7,8,9,10,11};

int n, m, d, p, t;
int need[2][13][32];

int main() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    memset(need,0,sizeof(need));
	FOR(i,0,n-1) {
		cin >> m >> d >> p >> t;
		int w = 1;
		FOR(j,1,t) {
			if (d==1) {
				if (m==1) w = 0;
				m = pre[m];
				d = days[m];
			}
			else d = d-1;
			need[w][m][d] += p;
		}
	}
	int res = 0;
	FOR(w,0,1)
		FOR(i,1,12)
			FOR(j,1,31)
				if (need[w][i][j] > res) res = need[w][i][j];
	cout << res;
    return 0;
}


#include <iostream>
 #include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>

using namespace std;
#define FOR(i,a,b) for(int i=a; i<=b; i++)
#define DOW(i,a,b) for(int i=a; i>=b; i--)
#define REP(i,n) for(int i=0; i < n; i++)
typedef long long int64;
const int days[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
const int nex[] = {0,2,3,4,5,6,7,8,9,10,11,12,1};
const int pre[] = {0,12,1,2,3,4,5,6,7,8,9,10,11};

int need[13][32];
int m, d, p, t, n;

int main() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;

    FOR(i,0,n-1)  {
       cin >> m >> d >> p >> t;
       FOR(j,1,t) {
          if (d == 1) {m = pre[m]; d = days[pre[m]];}
           else d = d - 1;
          need[m][d] += p;
       }
    }
    int res = 0;
    FOR(i,1,12)
     FOR(j,1,31)
       if (need[i][j] > res) res = need[i][j];
    cout << res;
    //system("pause");
    return 0;
}


#include <iostream>
#include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
#define FOR(i,a,b) for(int i=a; i<=b; i++)
#define DOW(i,a,b) for(int i=a; i>=b; i--)
#define REP(i,n) for(int i=0; i < n; i++)
typedef long long int64;

int n;
vector<int> lab[6000];

int main() {
   // freopen("input.txt","r",stdin);
   // freopen("output.txt","w",stdout);
    cin >> n;
    int v;
    FOR(i,1,2*n)  {
      cin >> v;
      //cout << v << i << endl;
      lab[v].push_back(i);
    }
    FOR(i,1,5000) {
       if (lab[i].size() % 2 == 1) { cout << -1; return 0; }
    }
    FOR(i,1,5000)
     if (lab[i].size() != 0)
     {
       //cout<< lab[i].size();
       FOR(j,0,(lab[i].size() / 2)-1)
           cout << lab[i][2*j]  << " " << lab[i][2*j+1] << endl;
           }
    //system("pause");
    return 0;
}


#include <iostream>
 #include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>

using namespace std;
#define FOR(i,a,b) for(int i=a; i<=b; i++)
#define DOW(i,a,b) for(int i=a; i>=b; i--)
#define REP(i,n) for(int i=0; i < n; i++)
typedef long long int64;
const int days[] = {0,31,29,31,30,31,30,31,31,30,31,30,31};
const int nex[] = {0,2,3,4,5,6,7,8,9,10,11,12,1};
const int pre[] = {0,12,1,2,3,4,5,6,7,8,9,10,11};

int need[13][32];
int m, d, p, t, n;

int main() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    memset(need,0,sizeof(need));
    FOR(i,0,n-1)  {
       cin >> m >> d >> p >> t;
       FOR(j,1,t) {
          if (d == 1) {m = pre[m]; d = days[pre[m]];}
           else d = d - 1;
          need[m][d] += p;
//          cout << m << " " << d << " " << p << endl;
       }
    }
    int res = 0;
    FOR(i,1,12)
     FOR(j,1,31)
       if (need[i][j] > res) res = need[i][j];
    cout << res;
    //system("pause");
    return 0;
}


#include <iostream>
 #include <vector>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstdio>

using namespace std;
#define FOR(i,a,b) for(int i=a; i<=b; i++)
#define DOW(i,a,b) for(int i=a; i>=b; i--)
#define REP(i,n) for(int i=0; i < n; i++)
typedef long long int64;
const int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
const int nex[] = {0,2,3,4,5,6,7,8,9,10,11,12,1};
const int pre[] = {0,12,1,2,3,4,5,6,7,8,9,10,11};

int need[13][32];
int m, d, p, t, n;

int main() {
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;

    FOR(i,0,n-1)  {
       cin >> m >> d >> p >> t;
       FOR(j,1,t) {
          if (d == 1) {m = pre[m]; d = days[pre[m]];}
           else d = d - 1;
          need[m][d] += p;
       }
    }
    int res = 0;
    FOR(i,1,12)
     FOR(j,1,31)
       if (need[i][j] > res) res = need[i][j];
    cout << res;
    //system("pause");
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[10001],ans,fr,to,num;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int check(int x)
{
    return b[x];
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
    {
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    }
    //sort(a+1,a+n+1,cmp);
    for (i = 1; i <= n; i++)
    {

        fr = to = 0;

        for (j = 1;j <= a[i].m-1; j++) fr+=b[j];

        fr += a[i].d - 1;

        to += fr - a[i].t + 1;

        fr += 500;
        to += 500;

        swap (fr,to);
        for (j = fr; j <=to; j++)
            days[j]+=a[i].p;
    }
    for (i = 0; i <= 10000; i++)
        ans = max(ans , days[i]);
    cout << ans;
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[10001],ans,fr,to,num;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int check(int x)
{
    return b[x];
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
    {
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    }
    //sort(a+1,a+n+1,cmp);
    for (i = 1; i <= n; i++)
    {

        //fr = to = 0;

        for (j = 1;j <= a[i].m-1; j++) fr+=b[j];

        to += a[i].d - a[i].t + 1;
        fr += a[i].d - 1;

        fr += 500;
        to += 500;

        swap (fr,to);
        for (j = fr; j <=to; j++)
            days[j]+=a[i].p;
    }
    for (i = 0; i <= 10000; i++)
        ans = max(ans , days[i]);
    cout << ans+1;
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[10001],ans,fr,to,num;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int check(int x)
{
    return b[x];
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
    {
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    }
    //sort(a+1,a+n+1,cmp);
    for (i = 1; i <= n; i++)
    {
        //to = 0;
        for (j = 1;j <= a[i].m-1; j++) fr+=b[j];
        to += a[i].d - a[i].t+1;
        fr += a[i].d - 1;
        fr+=500;
        to+=500;

        for (j = min(fr,to); j <= max(to,fr); j++)
            days[j]+=a[i].p;
    }
    for (i = 1; i <= 10000; i++)
        ans = max(ans , days[i]);
    cout << ans;
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[10001],ans,fr,to,num;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int check(int x)
{
    return b[x];
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
    {
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    }
    //sort(a+1,a+n+1,cmp);
    for (i = 1; i <= n; i++)
    {
        fr = to = 0;
        for (j = 1;j <= a[i].m-1; j++) fr+=b[j];
        to += a[i].d - a[i].t+1;
        fr += a[i].d - 1;
        fr+=500;
        to+=500;

        for (j = min(fr,to); j <= max(to,fr); j++)
            days[j]+=a[i].p;
    }
    for (i = 1; i <= 10000; i++)
        ans = max(ans , days[i]);
    cout << ans;
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[1001],ans,fr,to;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    sort(a + 1 , a + 1 + n, cmp);

    for (i = 1; i <= n; i++)
    {
        fr = a[i].d - a[i].t;
        to = a[i].d - 1;
        for (j = fr; j <= to; j++)
            days[j]+=a[i].p;
    }
    for (i = 1; i <= 100; i++)
        ans = max(ans , days[i]);
    cout << ans;
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[10001],ans,fr,to,num;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int check(int x)
{
    return b[x];
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
    {
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    }
    //sort(a+1,a+n+1,cmp);
    for (i = 1; i <= n; i++)
    {

        fr = to = 0;

        for (j = 1;j <= a[i].m-1; j++) fr+=b[j];

        to += fr - a[i].t + 1;
        fr += a[i].d - 1;

        fr += 500;
        to += 500;

        swap (fr,to);
        for (j = fr; j <=to; j++)
            days[j]+=a[i].p;
    }
    for (i = 0; i <= 10000; i++)
        ans = max(ans , days[i]);
    cout << ans;
    return 0;
}


#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<vector>
#include<iostream>
#include<algorithm>

#define sqr(a) ((a)*(a))
#define eps 1e-9
#define INF 2147483647
#define N 1000*1000*1000
#define cub(a) ((a)*(a)*(a))

using namespace std;
int b[13],n,j,i,days[10001],ans,fr,to,num;
struct Pair {
    int m;
    int d;
    int p;
    int t;
    } a[190];
bool cmp (Pair q , Pair w)
{
    return (q.m < w.m);
}
int check(int x)
{
    return b[x];
}
int main()

{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    cin >> n;
    b[1] = 31; b[4] = 30; b[7] = 31; b[10] = 31;
    b[2] = 28; b[5] = 31; b[8] = 31; b[11] = 30;
    b[3] = 31; b[6] = 30; b[9] = 30; b[12] = 31;

    for (i = 1; i <= n; i++)
    {
        cin >> a[i].m >> a[i].d >> a[i].p >> a[i].t;
    }
    //sort(a+1,a+n+1,cmp);
    for (i = 1; i <= n; i++)
    {

        fr = to = 0;

        for (j = 1;j <= a[i].m-1; j++) fr+=b[j];

        fr += a[i].d - 1;

        to += a[i].d - a[i].t ;

        fr += 500;
        to += 500;

        swap (fr,to);
        for (j = fr; j <=to; j++)
            days[j]+=a[i].p;
    }
    for (i = 0; i <= 10000; i++)
        ans = max(ans , days[i]);
    cout << ans;
    return 0;
}


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <string>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;

int a[26];
int b[26];
int ax[26];

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	string t, s;
	cin >> t >> s;
	int i;
	for(i = 0; i < t.size(); i++)
	{
		a[t[i] - 'A']++;
		b[s[i] - 'A']++;
	}
	int answ = 0;
	int k = 0;
	for(i = 0; i < t.size(); i++)
	{
		while(a[k] >= b[k]) k++;
		if(a[t[i]-'A'] > b[t[i]-'A'])
		{
			if((a[t[i] - 'A'] > 1 && t[i] - 'A' < k) && ax[t[i] - 'A'] < b[t[i] - 'A'])
			{
				ax[t[i] - 'A']++;
				continue;
			}
			a[t[i] - 'A']--;
			t[i] = k + 'A';
			a[k]++;
			answ++;
		}
	}
	cout << answ << "\n";
	cout << t;
}


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <string>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;

struct oly
{
	int st;
	int end;
	int jur;
};

int y[12];

oly a[100];

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	y[0] = 31;
	y[1] = 28;
	y[2] = 31;
	y[3] = 30;
	y[4] = 31;
	y[5] = 30;
	y[6] = 31;
	y[7] = 31;
	y[8] = 30;
	y[9] = 31;
	y[10] = 30;
	y[11] = 31;
	int n;
	cin >> n;
	int i, j;
	int tmp1;
	int tmp2;
	int tmp3;
	int tmp4;
	int answ = 0;
	for(i = 0; i < n; i++)
	{
		tmp4 = 0;
		cin >> tmp1 >> tmp2 >> a[i].jur >> tmp3;
		for(j = 0; j < tmp1; j++)
		{
			tmp4 += y[j];
		}
		tmp4 += tmp2;
		a[i].end = tmp4-1;
		a[i].st = a[i].end - tmp3 + 1;
		if(a[i].jur > answ)
			answ = a[i].jur;
	}
	for(i = 0; i < n; i++)
	{
		tmp1 = a[i].st;
		tmp2 = a[i].end;
		tmp3 = a[i].jur;
		for(j = 0; j < n; j++)
		{
			if(i != j)
			{

			if((a[j].end >= tmp1 && a[j].end <= tmp2) || (a[j].st <= tmp2 && a[j].st >= tmp1))
			{
				tmp3 += a[j].jur;
				tmp1 = max(tmp1, a[j].st);
				tmp2 = min(tmp2, a[j].end);
				if(tmp3 > answ) answ = tmp3;
			}
			}
		}
	}
	cout << answ;
}


#include <stdio.h>
#include <stdlib.h>

#define REP(i, n) for((i) = 0; (i) < (n); i++)

int i, n, negative = 0, zero = 0, v[110];

void swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void sort(int v[], int n) {
    int i, j;
    for(i = 0; i < n; i++) {
        for(j = i + 1; j < n; j++) {
            if(v[j] < v[i]) swap(&v[i], &v[j]);
        }
    }
}

int main(void) {
    scanf("%d", &n);
    REP(i, n) {
        scanf("%d", &v[i]);
        if(v[i] < 0) negative += 1;
        if(v[i] == 0) zero += 1;
    }
    sort(v, n);
    if(zero == n) {
        puts("0");
    } else if(negative % 2 == 0) {
        REP(i, n) if(v[i] != 0) {
            printf("%d ", v[i]);
        }
        printf("\n");
    } else {
        REP(i, n) if(v[i] != 0) {
            if(v[i] < 0) {
                if(negative <= 1) continue;
                negative -= 1;
            }
            printf("%d ", v[i]);
        }
    }
    return 0;
}


#include <stdio.h>
#include <stdlib.h>

#define REP(i, n) for((i) = 0; (i) < (n); i++)

int i, n, negative = 0, zero = 0, v[110];

void swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void sort(int v[], int n) {
    int i, j;
    for(i = 0; i < n; i++) {
        for(j = i + 1; j < n; j++) {
            if(v[j] < v[i]) swap(&v[i], &v[j]);
        }
    }
}

int main(void) {
    scanf("%d", &n);
    REP(i, n) {
        scanf("%d", &v[i]);
        if(v[i] < 0) negative += 1;
        if(v[i] == 0) zero += 1;
    }
    sort(v, n);
    if(zero == n) {
        puts("0");
    } else if(negative % 2 == 0) {
        REP(i, n) if(v[i] != 0) {
            printf("%d ", v[i]);
        }
        printf("\n");
    } else if(negative == n) {
        if(n == 1) {
            printf("%d", v[0]);
        } else {
            REP(i, n) if(i != n - 1) {
                printf("%d ", v[i]);
            }
        }
    } else if(zero + negative == n) {
        if(negative % 2 == 0) {
            puts("0");
        } else {
            REP(i, n) {
                if(v[i] != 0) {
                    if(negative <= 1) continue;
                    printf("%d ", v[i]);
                    negative -= 1;
                }
            }
        }
    } else {
        REP(i, n) if(v[i] != 0) {
            if(v[i] < 0) {
                if(negative <= 1) continue;
                negative -= 1;
            }
            printf("%d ", v[i]);
        }
    }
    return 0;
}


#include <stdio.h>
#include <stdlib.h>

#define REP(i, n) for((i) = 0; (i) < (n); i++)

int i, n, negative = 0, zero = 0, v[110];

void swap(int* a, int* b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

void sort(int v[], int n) {
    int i, j;
    for(i = 0; i < n; i++) {
        for(j = i + 1; j < n; j++) {
            if(v[j] < v[i]) swap(&v[i], &v[j]);
        }
    }
}

int main(void) {
    scanf("%d", &n);
    REP(i, n) {
        scanf("%d", &v[i]);
        if(v[i] < 0) negative += 1;
        if(v[i] == 0) zero += 1;
    }
    sort(v, n);
    if(zero == n) {
        puts("0");
    } else if(negative % 2 == 0) {
        REP(i, n) if(v[i] != 0) {
            printf("%d ", v[i]);
        }
        printf("\n");
    } else if(negative == n) {
        if(n == 1) {
            printf("%d", v[0]);
        } else {
            REP(i, n) if(i != n - 1) {
                printf("%d ", v[i]);
            }
        }
    } else {
        REP(i, n) if(v[i] != 0) {
            if(v[i] < 0) {
                if(negative <= 1) continue;
                negative -= 1;
            }
            printf("%d ", v[i]);
        }
    }
    return 0;
}


#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, j, tmp, count_big = 0, count_sm = 0;
    int a[100];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < n - 1; i++)
        for (j = i; j < n; j++)
            if (a[j] > a[i]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
    for (i = 0; i < n; i++) {
        if (a[i] > 0) count_big++;
        if (a[i] < 0) count_sm++;
    }
    if (count_big == 0 && count_sm == 1 && n == 1) printf("%d ", a[n - 1]);
    else if ((count_big == 0 && count_sm == 1 && n != 1) || (count_big == 0 && count_sm == 0)) printf("0 ");
    else { for (i = 0; i < count_big; i++)
        printf("%d ", a[i]);
    for (i = 1; i <= count_sm - (count_sm % 2); i++)
        printf("%d ", a[n - i]);
    }

    return 0;
}


#include <stdio.h>
#include <stdlib.h>

int main()
{
    int n, i, j, tmp, count_big = 0, count_sm = 0;
    int a[100];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%d", &a[i]);
    for (i = 0; i < n - 1; i++)
        for (j = i; j < n; j++)
            if (a[j] > a[i]) {
                tmp = a[i];
                a[i] = a[j];
                a[j] = tmp;
            }
    for (i = 0; i < n; i++) {
        if (a[i] > 0) count_big++;
        if (a[i] < 0) count_sm++;
    }
    if (count_big == 0 && count_sm == 1 && n == 1) printf("%d ", a[n - 1]);
    if (count_big == 0 && count_sm == 1 && n != 1) printf("0 ");

    for (i = 0; i < count_big; i++)
        printf("%d ", a[i]);
    for (i = 1; i <= count_sm - (count_sm % 2); i++)
        printf("%d ", a[n - i]);

    return 0;
}


#include <stdio.h>

int main()
{
    int a[200], b[200], i, j, n, flag, count, min, max, slag;

    scanf("%d", &n);
    for( i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }
    for( i=0, count=0, flag=0; i<n; i++ ){
        if(a[i]==0 ) count++;
        if( a[i]<0 ) flag++;
    }
    if( count==n || (flag+count==n && flag==1 &&count>0) ) printf("0\n");
    else{

        for( i=0, min=1000, count=0, j=0; i<n; i++ )
        {
            if( a[i] < min ) min = a[i];
            if( a[i]<0 ) count++;
            if( a[i]==0 ) continue;
            b[j++] = a[i];
        }
        n=j;
        if( n==1 ) printf("%d\n", a[0]);
        else if( count>0 && count%2==1 )
        {
            max = -1000;
            for( i=0; i<n; i++ )
            {
                if( b[i]<0 )
                {
                    if( b[i]>max ) max=b[i];
                }
            }
            for( i=0, flag=0, slag=0; i<n; i++ )
            {
                if( b[i]==max ){
                    if( slag==0 ){
                        slag=1;
                        continue;
                    }
                }
                if( flag==0 ) {
                    printf("%d", b[i]);
                    flag=1;
                    continue;
                }
                printf(" %d", b[i]);
            }
            printf("\n");
        }
        else
        {
            for( i=0; i<n; i++ )
            {
                if( i==0 ) printf("%d", b[i]);
                else printf(" %d", b[i]);
            }
            printf("\n");
        }
    }
    return 0;
}


#include <stdio.h>

int main()
{
    int a[200], b[200], i, j, n, flag, count, min, max, slag;

    scanf("%d", &n);
    for( i=0; i<n; i++)
    {
        scanf("%d", &a[i]);
    }
    for( i=0, count=0, flag=0; i<n; i++ ){
        if(a[i]==0 ) count++;
        if( a[i]<0 ) flag++;
    }
    if( count==n || (flag+count==n && flag==1 &&count>0) ) printf("0\n");
    else{

        for( i=0, min=1000, count=0, j=0; i<n; i++ )
        {
            if( a[i] < min ) min = a[i];
            if( a[i]<0 ) count++;
            if( a[i]==0 ) continue;
            b[j++] = a[i];
        }
        n=j;
        if( n==1 ) printf("%d\n", b[0]);
        else if( count>0 && count%2==1 )
        {
            max = -1000;
            for( i=0; i<n; i++ )
            {
                if( b[i]<0 )
                {
                    if( b[i]>max ) max=b[i];
                }
            }
            for( i=0, flag=0, slag=0; i<n; i++ )
            {
                if( b[i]==max ){
                    if( slag==0 ){
                        slag=1;
                        continue;
                    }
                }
                if( flag==0 ) {
                    printf("%d", b[i]);
                    flag=1;
                    continue;
                }
                printf(" %d", b[i]);
            }
            printf("\n");
        }
        else
        {
            for( i=0; i<n; i++ )
            {
                if( i==0 ) printf("%d", b[i]);
                else printf(" %d", b[i]);
            }
            printf("\n");
        }
    }
    return 0;
}


import java.util.Scanner;
public class Ishu
{
	public static void main(String[] args)
	{
	Scanner scan=new Scanner(System.in);
	int n,i,j,non=0,zeros=0,ioz=0;
	int[] c=new int[100];
	n=scan.nextInt();
	for(i=0;i<n;++i)
		{
		c[i]=scan.nextInt();
		if(c[i]<0)
			++non;
		else if(c[i]==0)
			{
			ioz=i;
			++zeros;
			}
		}
	if(zeros>0&&non==1&&zeros+non==n)
		System.out.println(c[ioz]);
	else
		{
		ioz=1;
		for(i=0;i<n&&ioz==1;++i)
			{
			ioz=0;
			for(j=0;j<n-1;++j)
				if(c[j]>c[j+1])
					{
					ioz=c[j];
					c[j]=c[j+1];
					c[j+1]=ioz;
					ioz=1;
					}
			}
		if(non%2==1&&non>1)
			ioz=non-1;
		else if(non%2==0||(non==1&&n==1))
			ioz=non;
		for(i=0;i<ioz;++i)
			System.out.print(c[i]+" ");
		for(i=ioz;i<n;++i)
			if(c[i]>0)
				System.out.print(c[i]+" ");
		}
	}
}


import java.util.Scanner;
public class Ishu
{
	public static void main(String[] args)
	{
	Scanner scan=new Scanner(System.in);
	int n,i,j,non=0,zeros=0,ioz=0;
	int[] c=new int[100];
	n=scan.nextInt();
	for(i=0;i<n;++i)
		{
		c[i]=scan.nextInt();
		if(c[i]<0)
			++non;
		else if(c[i]==0)
			{
			ioz=i;
			++zeros;
			}
		}
	if(zeros>0&&non<=1&&zeros+non==n)
		System.out.println(c[ioz]);
	else
		{
		ioz=1;
		for(i=0;i<n&&ioz==1;++i)
			{
			ioz=0;
			for(j=0;j<n-1;++j)
				if(c[j]>c[j+1])
					{
					ioz=c[j];
					c[j]=c[j+1];
					c[j+1]=ioz;
					ioz=1;
					}
			}
		if(non%2==1&&non>1)
			ioz=non-1;
		else if(non%2==0||(non==1&&n==1))
			ioz=non;
		for(i=0;i<ioz;++i)
			System.out.print(c[i]+" ");
		for(i=ioz;i<n;++i)
			if(c[i]>0)
				System.out.print(c[i]+" ");
		}
	}
}


import java.util.Arrays;
import java.util.Scanner;

public class Codeforces45I_TCMCF {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        int len_neg = 0;
        String result = "";
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            a[i] = x;
            if(x<0){
                b[len_neg++] = x;
            }else if(x>0){
                result+=x+" ";
            }
        }
        scanner.close();
        Arrays.sort(b);
        len_neg = len_neg%2==0?len_neg:(len_neg-1);
        for (int i = 0; i < len_neg; i++) {
            result+=b[i]+" ";
        }
        if(n==0) {
            System.out.println(a[0]);
            return;
        }
        if(!result.equals("")){
            System.out.println(result);
        }else{
            System.out.println(0);
        }

    }
}


import java.util.Arrays;
import java.util.Scanner;

public class Codeforces45I_TCMCF {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        int len_neg = 0;
        String result = "";
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            a[i] = x;
            if(x<0){
                b[len_neg++] = x;
            }else if(x>0){
                result+=x+" ";
            }
        }
        scanner.close();
        Arrays.sort(b);
        len_neg = len_neg%2==0?len_neg:(len_neg-1);
        for (int i = 0; i < len_neg; i++) {
            result+=b[i]+" ";
        }
        if(!result.equals("")){
            System.out.println(result);
        }else{
            System.out.println(0);
        }
        if(n==0&&a[0]<=0)
            System.out.println(0);
    }
}


import java.util.Arrays;
import java.util.Scanner;

public class Codeforces45I_TCMCF {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        int len_neg = 0;
        String result = "";
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            a[i] = x;
            if(x<0){
                b[len_neg++] = x;
            }else if(x>0){
                result+=x+" ";
            }
        }
        scanner.close();
        Arrays.sort(b);
        len_neg = len_neg%2==0?len_neg:(len_neg-1);
        for (int i = 0; i < len_neg; i++) {
            result+=b[i]+" ";
        }
        if(n==1) {
            System.out.println(a[0]);
            return;
        }
        if(!result.equals("")){
            System.out.println(result);
        }else{
            System.out.println(0);
        }

    }
}


import java.util.Arrays;
import java.util.Scanner;

public class Codeforces45I_TCMCF {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        int[] b = new int[n];
        int len_neg = 0;
        String result = "";
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            a[i] = x;
            if(x<0){
                b[len_neg++] = x;
            }else if(x>0){
                result+=x+" ";
            }
        }
        scanner.close();
        Arrays.sort(b);
        len_neg = len_neg%2==0?len_neg:(len_neg-1);
        for (int i = 0; i < len_neg; i++) {
            result+=b[i]+" ";
        }
        if(!result.equals("")){
            System.out.println(result);
        }else{
            System.out.println(0);
        }
        if(n==0)
            System.out.println(a[0]);
    }
}


import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class cf1 {
    static long mod = (long)1e9 + 7;
    static long mod1 = 998244353;
    static FastScanner f;
    static PrintWriter pw = new PrintWriter(System.out);
    static Scanner S = new Scanner(System.in);
    static long x0; static long y0;
    static int inf = (int)(1e9) + 5;
    static long iinf = (long)(1e18) + 5l;
    static double eps = (double)1e-4;
    public static void solve()throws IOException {
        int n = f.ni();
        int arr[] = new int[n];
        ArrayList<Integer> pos = new ArrayList<>();
        ArrayList<Integer> neg = new ArrayList<>();
        ArrayList<Integer> zero = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            arr[i] = f.ni();
            if (arr[i] > 0) pos.add(arr[i]);
            else if (arr[i] < 0) neg.add(arr[i]);
            else zero.add(arr[i]);
        }

        int ans = pos.size();
        if (neg.size() >= 2) {
            if (ise(neg.size())) {
                ans += neg.size();
            }
            else {
                ans += neg.size() - 1;
            }
        }

        Collections.sort(neg , Collections.reverseOrder());

        if (ans == 0) {
            //pn(1);
            if (zero.size() > 0) pn(0);
            else pn(neg.get(0));
            return;
        }

        //pn(ans);
        for (int x : pos) p(x + " ");
        for (int i = 0; i < ans - pos.size(); ++i) p(neg.get(i) + " ");
    }
    public static void main(String[] args)throws NumberFormatException , IOException {
        init();
        boolean tc = false;
        int t = tc ? f.ni() : 1;
        while(t --> 0) solve();
        pw.flush();
        pw.close();
    }

/******************************END OF MAIN PROGRAM*******************************************/
    public static void init()throws IOException{if(System.getProperty("ONLINE_JUDGE")==null){f=new FastScanner("");}else{f=new FastScanner(System.in);}}
    public static class FastScanner {
        BufferedReader br;StringTokenizer st;
        FastScanner(InputStream stream){try{br=new BufferedReader(new InputStreamReader(stream));}catch(Exception e){e.printStackTrace();}}
        FastScanner(String str){try{br=new BufferedReader(new FileReader("!a.txt"));}catch(Exception e){e.printStackTrace();}}
        String next(){while(st==null||!st.hasMoreTokens()){try{st=new StringTokenizer(br.readLine());}catch(IOException e){e.printStackTrace();}}return st.nextToken();}
        String nextLine()throws IOException{return br.readLine();}int ni(){return Integer.parseInt(next());}long nl(){return Long.parseLong(next());}double nd(){return Double.parseDouble(next());}
    }
    public static void pn(Object o){pw.println(o);}
    public static void p(Object o){pw.print(o);}
    public static void pni(Object o){pw.println(o);pw.flush();}
    static int gcd(int a,int b){if(b==0)return a;else{return gcd(b,a%b);}}
    static long gcd(long a,long b){if(b==0l)return a;else{return gcd(b,a%b);}}
    static long lcm(long a,long b){return (a*b/gcd(a,b));}
    static long exgcd(long a,long b){if(b==0){x0=1;y0=0;return a;}long temp=exgcd(b,a%b);long t=x0;x0=y0;y0=t-a/b*y0;return temp;}
    static long pow(long a,long b){long res=1;while(b>0){if((b&1)==1)res=res*a;b>>=1;a=a*a;}return res;}
    static long mpow(long a,long b){long res=1;while(b>0l){if((b&1)==1l)res=((res%mod)*(a%mod))%mod;b>>=1l;a=((a%mod)*(a%mod))%mod;}return res;}
    static long mul(long a , long b){return ((a%mod)*(b%mod)%mod);}
    static long adp(long a , long b){return ((a%mod)+(b%mod)%mod);}
    static int log2(int x){return (int)(Math.log(x)/Math.log(2));}
    static boolean isPrime(long n){if(n<=1)return false;if(n<=3)return true;if(n%2==0||n%3==0)return false;for(long i=5;i*i<=n;i=i+6)if(n%i==0||n%(i+2)==0)return false;return true;}
    static boolean isPrime(int n){if(n<=1)return false;if(n<=3)return true;if(n%2==0||n%3==0)return false;for(int i=5;i*i<=n;i=i+6)if(n%i==0||n%(i+2)==0)return false;return true;}
    static HashSet<Long> factors(long n){HashSet<Long> hs=new HashSet<Long>();for(long i=1;i<=(long)Math.sqrt(n);i++){if(n%i==0){hs.add(i);hs.add(n/i);}}return hs;}
    static HashSet<Integer> factors(int n){HashSet<Integer> hs=new HashSet<Integer>();for(int i=1;i<=(int)Math.sqrt(n);i++){if(n%i==0){hs.add(i);hs.add(n/i);}}return hs;}
    static HashSet<Long> pf(long n){HashSet<Long> ff=factors(n);HashSet<Long> res=new HashSet<Long>();for(Long i:ff)if(isPrime(i))res.add(i);return res;}
    static HashSet<Integer> pf(int n){HashSet<Integer> ff=factors(n);HashSet<Integer> res=new HashSet<Integer>();for(Integer i:ff)if(isPrime(i))res.add(i);return res;}
    static int[] inpint(int n){int arr[]=new int[n+1];for(int i=1;i<=n;++i){arr[i]=f.ni();}return arr;}
    static long[] inplong(int n){long arr[] = new long[n+1];for(int i=1;i<=n;++i){arr[i]=f.nl();}return arr;}
    static boolean ise(int x){return ((x&1)==0);}static boolean ise(long x){return ((x&1)==0);}
    static int gnv(char c){return Character.getNumericValue(c);}//No. of integers less than equal to i in ub
    static int log(long x){return x==1?0:(1+log(x/2));} static int log(int x){return x==1?0:(1+log(x/2));}
    static int upperbound(int a[],int i){int lo=0,hi=a.length-1,mid=0;int count=0;while(lo<=hi){mid=(lo+hi)/2;if(a[mid]<=i){count=mid+1;lo=mid+1;}else hi=mid-1;}return count;}
    static void sort(int[] a){ArrayList<Integer> l=new ArrayList<>();for(int i:a)l.add(i);Collections.sort(l);for(int i=0;i<a.length;++i)a[i]=l.get(i);}
    static void sort(long[] a){ArrayList<Long> l=new ArrayList<>();for(long i:a)l.add(i);Collections.sort(l);for(int i=0;i<a.length;++i)a[i]=l.get(i);}
    static void sort(ArrayList<Integer> a){Collections.sort(a);}//!Precompute fact in ncr()!
    static int nextPowerOf2(int n){int count=0;if(n>0&&(n&(n-1))==0)return n;while(n!=0){n>>=1;count += 1;}return 1<<count;}
}


import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class cf1 {
    static long mod = (long)1e9 + 7;
    static long mod1 = 998244353;
    static FastScanner f;
    static PrintWriter pw = new PrintWriter(System.out);
    static Scanner S = new Scanner(System.in);
    static long x0; static long y0;
    static int inf = (int)(1e9) + 5;
    static long iinf = (long)(1e18) + 5l;
    static double eps = (double)1e-4;
    public static void solve()throws IOException {
        int n = f.ni();
        int arr[] = new int[n];
        ArrayList<Integer> pos = new ArrayList<>();
        ArrayList<Integer> neg = new ArrayList<>();
        ArrayList<Integer> zero = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            arr[i] = f.ni();
            if (arr[i] > 0) pos.add(arr[i]);
            else if (arr[i] < 0) neg.add(arr[i]);
            else zero.add(arr[i]);
        }

        int ans = pos.size();
        if (neg.size() >= 2) {
            if (ise(neg.size())) {
                ans += neg.size();
            }
            else {
                ans += neg.size() - 1;
            }
        }

        Collections.sort(neg , Collections.reverseOrder());

        if (ans == 0) {
            pn(1);
            if (zero.size() > 0) pn(0);
            else pn(neg.get(0));
            return;
        }

        pn(ans);
        for (int x : pos) p(x + " ");
        for (int i = 0; i < ans - pos.size(); ++i) p(neg.get(i) + " ");
    }
    public static void main(String[] args)throws NumberFormatException , IOException {
        init();
        boolean tc = false;
        int t = tc ? f.ni() : 1;
        while(t --> 0) solve();
        pw.flush();
        pw.close();
    }

/******************************END OF MAIN PROGRAM*******************************************/
    public static void init()throws IOException{if(System.getProperty("ONLINE_JUDGE")==null){f=new FastScanner("");}else{f=new FastScanner(System.in);}}
    public static class FastScanner {
        BufferedReader br;StringTokenizer st;
        FastScanner(InputStream stream){try{br=new BufferedReader(new InputStreamReader(stream));}catch(Exception e){e.printStackTrace();}}
        FastScanner(String str){try{br=new BufferedReader(new FileReader("!a.txt"));}catch(Exception e){e.printStackTrace();}}
        String next(){while(st==null||!st.hasMoreTokens()){try{st=new StringTokenizer(br.readLine());}catch(IOException e){e.printStackTrace();}}return st.nextToken();}
        String nextLine()throws IOException{return br.readLine();}int ni(){return Integer.parseInt(next());}long nl(){return Long.parseLong(next());}double nd(){return Double.parseDouble(next());}
    }
    public static void pn(Object o){pw.println(o);}
    public static void p(Object o){pw.print(o);}
    public static void pni(Object o){pw.println(o);pw.flush();}
    static int gcd(int a,int b){if(b==0)return a;else{return gcd(b,a%b);}}
    static long gcd(long a,long b){if(b==0l)return a;else{return gcd(b,a%b);}}
    static long lcm(long a,long b){return (a*b/gcd(a,b));}
    static long exgcd(long a,long b){if(b==0){x0=1;y0=0;return a;}long temp=exgcd(b,a%b);long t=x0;x0=y0;y0=t-a/b*y0;return temp;}
    static long pow(long a,long b){long res=1;while(b>0){if((b&1)==1)res=res*a;b>>=1;a=a*a;}return res;}
    static long mpow(long a,long b){long res=1;while(b>0l){if((b&1)==1l)res=((res%mod)*(a%mod))%mod;b>>=1l;a=((a%mod)*(a%mod))%mod;}return res;}
    static long mul(long a , long b){return ((a%mod)*(b%mod)%mod);}
    static long adp(long a , long b){return ((a%mod)+(b%mod)%mod);}
    static int log2(int x){return (int)(Math.log(x)/Math.log(2));}
    static boolean isPrime(long n){if(n<=1)return false;if(n<=3)return true;if(n%2==0||n%3==0)return false;for(long i=5;i*i<=n;i=i+6)if(n%i==0||n%(i+2)==0)return false;return true;}
    static boolean isPrime(int n){if(n<=1)return false;if(n<=3)return true;if(n%2==0||n%3==0)return false;for(int i=5;i*i<=n;i=i+6)if(n%i==0||n%(i+2)==0)return false;return true;}
    static HashSet<Long> factors(long n){HashSet<Long> hs=new HashSet<Long>();for(long i=1;i<=(long)Math.sqrt(n);i++){if(n%i==0){hs.add(i);hs.add(n/i);}}return hs;}
    static HashSet<Integer> factors(int n){HashSet<Integer> hs=new HashSet<Integer>();for(int i=1;i<=(int)Math.sqrt(n);i++){if(n%i==0){hs.add(i);hs.add(n/i);}}return hs;}
    static HashSet<Long> pf(long n){HashSet<Long> ff=factors(n);HashSet<Long> res=new HashSet<Long>();for(Long i:ff)if(isPrime(i))res.add(i);return res;}
    static HashSet<Integer> pf(int n){HashSet<Integer> ff=factors(n);HashSet<Integer> res=new HashSet<Integer>();for(Integer i:ff)if(isPrime(i))res.add(i);return res;}
    static int[] inpint(int n){int arr[]=new int[n+1];for(int i=1;i<=n;++i){arr[i]=f.ni();}return arr;}
    static long[] inplong(int n){long arr[] = new long[n+1];for(int i=1;i<=n;++i){arr[i]=f.nl();}return arr;}
    static boolean ise(int x){return ((x&1)==0);}static boolean ise(long x){return ((x&1)==0);}
    static int gnv(char c){return Character.getNumericValue(c);}//No. of integers less than equal to i in ub
    static int log(long x){return x==1?0:(1+log(x/2));} static int log(int x){return x==1?0:(1+log(x/2));}
    static int upperbound(int a[],int i){int lo=0,hi=a.length-1,mid=0;int count=0;while(lo<=hi){mid=(lo+hi)/2;if(a[mid]<=i){count=mid+1;lo=mid+1;}else hi=mid-1;}return count;}
    static void sort(int[] a){ArrayList<Integer> l=new ArrayList<>();for(int i:a)l.add(i);Collections.sort(l);for(int i=0;i<a.length;++i)a[i]=l.get(i);}
    static void sort(long[] a){ArrayList<Long> l=new ArrayList<>();for(long i:a)l.add(i);Collections.sort(l);for(int i=0;i<a.length;++i)a[i]=l.get(i);}
    static void sort(ArrayList<Integer> a){Collections.sort(a);}//!Precompute fact in ncr()!
    static int nextPowerOf2(int n){int count=0;if(n>0&&(n&(n-1))==0)return n;while(n!=0){n>>=1;count += 1;}return 1<<count;}
}


import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class cf1 {
    static long mod = (long)1e9 + 7;
    static long mod1 = 998244353;
    static FastScanner f;
    static PrintWriter pw = new PrintWriter(System.out);
    static Scanner S = new Scanner(System.in);
    static long x0; static long y0;
    static int inf = (int)(1e9) + 5;
    static long iinf = (long)(1e18) + 5l;
    static double eps = (double)1e-4;
    public static void solve()throws IOException {
        int n = f.ni();
        int arr[] = new int[n];
        ArrayList<Integer> pos = new ArrayList<>();
        ArrayList<Integer> neg = new ArrayList<>();
        ArrayList<Integer> zero = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            arr[i] = f.ni();
            if (arr[i] > 0) pos.add(arr[i]);
            else if (arr[i] < 0) neg.add(arr[i]);
            else zero.add(arr[i]);
        }

        int ans = pos.size();
        if (neg.size() >= 2) {
            if (ise(neg.size())) {
                ans += neg.size();
            }
            else {
                ans += neg.size() - 1;
            }
        }

        Collections.sort(neg);

        if (ans == 0) {
            //pn(1);
            if (zero.size() > 0) pn(0);
            else pn(neg.get(0));
            return;
        }

        //pn(ans);
        for (int x : pos) p(x + " ");
        for (int i = 0; i < ans - pos.size(); ++i) p(neg.get(i) + " ");
    }
    public static void main(String[] args)throws NumberFormatException , IOException {
        init();
        boolean tc = false;
        int t = tc ? f.ni() : 1;
        while(t --> 0) solve();
        pw.flush();
        pw.close();
    }

/******************************END OF MAIN PROGRAM*******************************************/
    public static void init()throws IOException{if(System.getProperty("ONLINE_JUDGE")==null){f=new FastScanner("");}else{f=new FastScanner(System.in);}}
    public static class FastScanner {
        BufferedReader br;StringTokenizer st;
        FastScanner(InputStream stream){try{br=new BufferedReader(new InputStreamReader(stream));}catch(Exception e){e.printStackTrace();}}
        FastScanner(String str){try{br=new BufferedReader(new FileReader("!a.txt"));}catch(Exception e){e.printStackTrace();}}
        String next(){while(st==null||!st.hasMoreTokens()){try{st=new StringTokenizer(br.readLine());}catch(IOException e){e.printStackTrace();}}return st.nextToken();}
        String nextLine()throws IOException{return br.readLine();}int ni(){return Integer.parseInt(next());}long nl(){return Long.parseLong(next());}double nd(){return Double.parseDouble(next());}
    }
    public static void pn(Object o){pw.println(o);}
    public static void p(Object o){pw.print(o);}
    public static void pni(Object o){pw.println(o);pw.flush();}
    static int gcd(int a,int b){if(b==0)return a;else{return gcd(b,a%b);}}
    static long gcd(long a,long b){if(b==0l)return a;else{return gcd(b,a%b);}}
    static long lcm(long a,long b){return (a*b/gcd(a,b));}
    static long exgcd(long a,long b){if(b==0){x0=1;y0=0;return a;}long temp=exgcd(b,a%b);long t=x0;x0=y0;y0=t-a/b*y0;return temp;}
    static long pow(long a,long b){long res=1;while(b>0){if((b&1)==1)res=res*a;b>>=1;a=a*a;}return res;}
    static long mpow(long a,long b){long res=1;while(b>0l){if((b&1)==1l)res=((res%mod)*(a%mod))%mod;b>>=1l;a=((a%mod)*(a%mod))%mod;}return res;}
    static long mul(long a , long b){return ((a%mod)*(b%mod)%mod);}
    static long adp(long a , long b){return ((a%mod)+(b%mod)%mod);}
    static int log2(int x){return (int)(Math.log(x)/Math.log(2));}
    static boolean isPrime(long n){if(n<=1)return false;if(n<=3)return true;if(n%2==0||n%3==0)return false;for(long i=5;i*i<=n;i=i+6)if(n%i==0||n%(i+2)==0)return false;return true;}
    static boolean isPrime(int n){if(n<=1)return false;if(n<=3)return true;if(n%2==0||n%3==0)return false;for(int i=5;i*i<=n;i=i+6)if(n%i==0||n%(i+2)==0)return false;return true;}
    static HashSet<Long> factors(long n){HashSet<Long> hs=new HashSet<Long>();for(long i=1;i<=(long)Math.sqrt(n);i++){if(n%i==0){hs.add(i);hs.add(n/i);}}return hs;}
    static HashSet<Integer> factors(int n){HashSet<Integer> hs=new HashSet<Integer>();for(int i=1;i<=(int)Math.sqrt(n);i++){if(n%i==0){hs.add(i);hs.add(n/i);}}return hs;}
    static HashSet<Long> pf(long n){HashSet<Long> ff=factors(n);HashSet<Long> res=new HashSet<Long>();for(Long i:ff)if(isPrime(i))res.add(i);return res;}
    static HashSet<Integer> pf(int n){HashSet<Integer> ff=factors(n);HashSet<Integer> res=new HashSet<Integer>();for(Integer i:ff)if(isPrime(i))res.add(i);return res;}
    static int[] inpint(int n){int arr[]=new int[n+1];for(int i=1;i<=n;++i){arr[i]=f.ni();}return arr;}
    static long[] inplong(int n){long arr[] = new long[n+1];for(int i=1;i<=n;++i){arr[i]=f.nl();}return arr;}
    static boolean ise(int x){return ((x&1)==0);}static boolean ise(long x){return ((x&1)==0);}
    static int gnv(char c){return Character.getNumericValue(c);}//No. of integers less than equal to i in ub
    static int log(long x){return x==1?0:(1+log(x/2));} static int log(int x){return x==1?0:(1+log(x/2));}
    static int upperbound(int a[],int i){int lo=0,hi=a.length-1,mid=0;int count=0;while(lo<=hi){mid=(lo+hi)/2;if(a[mid]<=i){count=mid+1;lo=mid+1;}else hi=mid-1;}return count;}
    static void sort(int[] a){ArrayList<Integer> l=new ArrayList<>();for(int i:a)l.add(i);Collections.sort(l);for(int i=0;i<a.length;++i)a[i]=l.get(i);}
    static void sort(long[] a){ArrayList<Long> l=new ArrayList<>();for(long i:a)l.add(i);Collections.sort(l);for(int i=0;i<a.length;++i)a[i]=l.get(i);}
    static void sort(ArrayList<Integer> a){Collections.sort(a);}//!Precompute fact in ncr()!
    static int nextPowerOf2(int n){int count=0;if(n>0&&(n&(n-1))==0)return n;while(n!=0){n>>=1;count += 1;}return 1<<count;}
}


	    /*
	     * Author- Priyam Vora
	     * BTech 2nd Year DAIICT
	     */

	    import java.io.*;
	    import java.math.*;
	    import java.util.*;
	    import javax.print.attribute.SetOfIntegerSyntax;

	    public class Graph1 {
	    	private static InputStream stream;
	    	private static byte[] buf = new byte[1024];
	    	private static int curChar;
	    	private static int numChars;
	    	private static SpaceCharFilter filter;
	    	private static PrintWriter pw;
	    	private static long count = 0,mod=1000000007;
	    	private static TreeSet<Integer>ts[]=new TreeSet[200000];
	    	private static HashSet hs=new HashSet();

	    	public static void main(String args[]) throws Exception {
	    		InputReader(System.in);
	    		pw = new PrintWriter(System.out);
	    		//ans();
	    		soln();
	    		pw.close();
	    	}

	    	public static long gcd(long x, long y) {
	    		if (x == 0)
	    			return y;
	    		else
	    			return gcd( y % x,x);
	    	}

	    	private static int BinarySearch(int a[], int low, int high, int target) {
	    		if (low > high)
	    			return -1;
	    		int mid = low + (high - low) / 2;
	    		if (a[mid] == target)
	    			return mid;
	    		if (a[mid] > target)
	    			high = mid - 1;
	    		if (a[mid] < target)
	    			low = mid + 1;
	    		return BinarySearch(a, low, high, target);
	    	}

	    	public static String reverseString(String s) {
	    		StringBuilder sb = new StringBuilder(s);
	    		sb.reverse();
	    		return (sb.toString());
	    	}

	    	public static long pow(long n, long p) {
	    		if(p==0)
	    			return 1;
	    		if(p==1)
	    			return n%mod;
	    		if(p%2==0){
	    			long temp=pow(n, p/2);
	    		return (temp*temp)%mod;
	    		}else{
	    			 	long temp=pow(n,p/2);
	    			 	temp=(temp*temp)%mod;
	    			 	return(temp*n)%mod;

	    		}
	    	}

	    	public static int[] radixSort(int[] f) {
	    		int[] to = new int[f.length];
	    		{
	    			int[] b = new int[65537];
	    			for (int i = 0; i < f.length; i++)
	    				b[1 + (f[i] & 0xffff)]++;
	    			for (int i = 1; i <= 65536; i++)
	    				b[i] += b[i - 1];
	    			for (int i = 0; i < f.length; i++)
	    				to[b[f[i] & 0xffff]++] = f[i];
	    			int[] d = f;
	    			f = to;
	    			to = d;
	    		}
	    		{
	    			int[] b = new int[65537];
	    			for (int i = 0; i < f.length; i++)
	    				b[1 + (f[i] >>> 16)]++;
	    			for (int i = 1; i <= 65536; i++)
	    				b[i] += b[i - 1];
	    			for (int i = 0; i < f.length; i++)
	    				to[b[f[i] >>> 16]++] = f[i];
	    			int[] d = f;
	    			f = to;
	    			to = d;
	    		}
	    		return f;
	    	}

	    	public static int nextPowerOf2(final int a) {
	    		int b = 1;
	    		while (b < a) {
	    			b = b << 1;
	    		}
	    		return b;
	    	}

	    	public static boolean PointInTriangle(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
	    		int s = p2 * p5 - p1 * p6 + (p6 - p2) * p7 + (p1 - p5) * p8;
	    		int t = p1 * p4 - p2 * p3 + (p2 - p4) * p7 + (p3 - p1) * p8;

	    		if ((s < 0) != (t < 0))
	    			return false;

	    		int A = -p4 * p5 + p2 * (p5 - p3) + p1 * (p4 - p6) + p3 * p6;
	    		if (A < 0.0) {
	    			s = -s;
	    			t = -t;
	    			A = -A;
	    		}
	    		return s > 0 && t > 0 && (s + t) <= A;
	    	}

	    	public static float area(int x1, int y1, int x2, int y2, int x3, int y3) {
	    		return (float) Math.abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
	    	}

	    	public static boolean isPrime(int n) {
	    		// Corner cases
	    		if (n <= 1)
	    			return false;
	    		if (n <= 3)
	    			return true;

	    		// This is checked so that we can skip
	    		// middle five numbers in below loop
	    		if (n % 2 == 0 || n % 3 == 0)
	    			return false;

	    		for (int i = 5; i * i <= n; i = i + 6)
	    			if (n % i == 0 || n % (i + 2) == 0)
	    				return false;

	    		return true;
	    	}

	    	//merge Sort

	    	static long sort(int a[])
	    	{  int n=a.length;
	    		int b[]=new int[n];
	    		return mergeSort(a,b,0,n-1);}
	    	static long mergeSort(int a[],int b[],long left,long right)
	    	{ long c=0;if(left<right)
	    	 {   long mid=left+(right-left)/2;
	    		 c= mergeSort(a,b,left,mid);
	    		 c+=mergeSort(a,b,mid+1,right);
	    		 c+=merge(a,b,left,mid+1,right); }
	    		return c;	 }
	    	static long merge(int a[],int  b[],long left,long mid,long right)
	    	{long c=0;int i=(int)left;int j=(int)mid; int k=(int)left;
	    	while(i<=(int)mid-1&&j<=(int)right)
	    	{ if(a[i]>a[j]) {b[k++]=a[i++]; }
	    	else	{ b[k++]=a[j++];c+=mid-i;}}
	    	while (i <= (int)mid - 1)   b[k++] = a[i++];
	    	while (j <= (int)right) b[k++] = a[j++];
	    	for (i=(int)left; i <= (int)right; i++)
	    		a[i] = b[i];  return c;  }
	    	public static boolean isSubSequence(String large, String small, int largeLen, int smallLen) {
	    		//base cases
	    		if (largeLen == 0)
	    			return false;
	    		if (smallLen == 0)
	    			return true;
	    		// If last characters of two strings are matching
	    		if (large.charAt(largeLen - 1) == small.charAt(smallLen - 1))
	    			isSubSequence(large, small, largeLen - 1, smallLen - 1);
	    		// If last characters are not matching
	    		return isSubSequence(large, small, largeLen - 1, smallLen);
	    	}

	    	// To Get Input
	    	// Some Buffer Methods

	    	public static void InputReader(InputStream stream1) {
	    		stream = stream1;
	    	}

	    	private static boolean isWhitespace(int c) {
	    		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	    	}

	    	private static boolean isEndOfLine(int c) {
	    		return c == '\n' || c == '\r' || c == -1;
	    	}

	    	private static int read() {
	    		if (numChars == -1)
	    			throw new InputMismatchException();
	    		if (curChar >= numChars) {
	    			curChar = 0;
	    			try {
	    				numChars = stream.read(buf);
	    			} catch (IOException e) {
	    				throw new InputMismatchException();
	    			}
	    			if (numChars <= 0)
	    				return -1;
	    		}
	    		return buf[curChar++];
	    	}

	    	private static int nextInt() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		int sgn = 1;
	    		if (c == '-') {
	    			sgn = -1;
	    			c = read();
	    		}
	    		int res = 0;
	    		do {
	    			if (c < '0' || c > '9')
	    				throw new InputMismatchException();
	    			res *= 10;
	    			res += c - '0';
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res * sgn;
	    	}

	    	private static long nextLong() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		int sgn = 1;
	    		if (c == '-') {
	    			sgn = -1;
	    			c = read();
	    		}
	    		long res = 0;
	    		do {
	    			if (c < '0' || c > '9')
	    				throw new InputMismatchException();
	    			res *= 10;
	    			res += c - '0';
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res * sgn;
	    	}

	    	private static String nextToken() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		StringBuilder res = new StringBuilder();
	    		do {
	    			res.appendCodePoint(c);
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res.toString();
	    	}

	    	private static String nextLine() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		StringBuilder res = new StringBuilder();
	    		do {
	    			res.appendCodePoint(c);
	    			c = read();
	    		} while (!isEndOfLine(c));
	    		return res.toString();
	    	}

	    	private static int[] nextIntArray(int n) {
	    		int[] arr = new int[n];
	    		for (int i = 0; i < n; i++) {
	    			arr[i] = nextInt();
	    		}
	    		return arr;
	    	}

	    	private static int[][] next2dArray(int n, int m) {
	    		int[][] arr = new int[n][m];
	    		for (int i = 0; i < n; i++) {
	    			for (int j = 0; j < m; j++) {
	    				arr[i][j] = nextInt();
	    			}
	    		}
	    		return arr;
	    	}
	    	private static char[][] nextCharArray(int n,int m){
	    		char [][]c=new char[n][m];
	    		for(int i=0;i<n;i++){
	    			String s=nextLine();
	    			for(int j=0;j<s.length();j++){
	    				c[i][j]=s.charAt(j);
	    			}
	    		}
	    		return c;
	    	}

	    	private static long[] nextLongArray(int n) {
	    		long[] arr = new long[n];
	    		for (int i = 0; i < n; i++) {
	    			arr[i] = nextLong();
	    		}
	    		return arr;
	    	}

	    	private static void pArray(int[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static void pArray(long[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static void pArray(boolean[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static boolean isSpaceChar(int c) {
	    		if (filter != null)
	    			return filter.isSpaceChar(c);
	    		return isWhitespace(c);
	    	}

	    	private interface SpaceCharFilter {
	    		public boolean isSpaceChar(int ch);
	    	}

	    	//----------------------------------------My Code------------------------------------------------//

	    	private static void soln() {

	    	int n=nextInt();
	    	int a[]=nextIntArray(n);
	    	Arrays.sort(a);
	    	int neg=0;
	    	ArrayList<Integer> ar=new ArrayList<>();
	    	for(int i=0;i<n;i++){
	    		if(a[i]<0){
	    			neg++;
	    		}
	    		if(a[i]>0){
	    			ar.add(a[i]);
	    		}
	    	}
	    	if(neg%2!=0)
	    		neg--;
	    	int count=0;

	    	for(int i=0;i<n;i++){
	    		if(count==neg){
	    			break;
	    		}
	    		if(a[i]<0){
	    			count++;
	    			pw.print(a[i]+" ");
	    		}

	    	}
	    	for(int i=0;i<ar.size();i++){
	    		pw.print(ar.get(i)+" ");
	    	}
	    	if(ar.size()==0 && neg==0){
	    		pw.println(a[0]);
	    	}
	    	}//-----------------------------------------The End--------------------------------------------------------------------------//

	 }

		class Pair implements Comparable<Pair>{
		    long id;
			long w;
			long h;
			Pair(long id,long w,long h){
				this.id=id;
				this.w=w;
				this.h=h;
			}
			@Override
			public int compareTo(Pair o) {
				// TODO Auto-generated method stub
			//	Sort in increasing order

				if(w>o.w)
					return 1;
				else if(w<o.w)
					return -1;
				else{
					if(h>o.h){
						return 1;
					}else if(o.h>h)
						return -1;
					else return 0;
				}

			}

		}
	        class Graph{
	        	private static int V,level[][],count=-1,lev_dfs[],degree=0,no_vert_conn_comp=0;
	        	private Stack <Integer>st=new Stack();
	        	private static LinkedList<Integer > adj[];
	        	private boolean[][] Visite;
	        	private static boolean [] Visited;
	        	private static TreeSet<Integer> ts=new TreeSet();
	    Graph(int V){
	    V++;
	    this.V=(V);
	    adj=new LinkedList[V];
	    Visite=new boolean[100][100];

 	   Visited=new boolean[V];
	    level=new int[100][100];
	   lev_dfs=new int[V];
	   for(int i=0;i<V;i++)
		   adj[i]=new LinkedList<Integer>();
	    }

	    void addEdge(int v,int w){

	    	if(adj[v]==null){
	    		adj[v]=new LinkedList();
	    	}
	    	adj[v].add(w);

	    }

	    public static int BFS2(int startVert,int dest){
	    	Visited=new boolean[V];
	    	for(int i=1;i<V;i++){
	    		lev_dfs[i]=-1;
	    	}
	    	Queue<Integer> q=new LinkedList<Integer>();
	    	q.add(startVert);

	    	lev_dfs[startVert]=0;
	    	while(!q.isEmpty()){
	    		int top=q.poll();

	    		Iterator<Integer> i= adj[top].listIterator();
	    		while(i.hasNext()){
	    			int n=i.next();
	    			if(!Visited[n]){
	    				q.add(n);
	    				Visited[n]=true;
	    				lev_dfs[n]=lev_dfs[top]+1;
	    			if(n==dest){
	    				q.clear();
	    				return lev_dfs[n];

	    			}
	    			}
	    		}
	    	}
	    	q.clear();
	    	return -1;
	    }
	    public int getEd(){
	    	return degree/2;
	    }
	    public void get(int from,int to){
	    	int h=lev_dfs[from]-lev_dfs[to];
	    	if(h<=0){
	    		System.out.println(-1);
	    	}else{
	    		System.out.println(h-1);
	    	}
	    }
	    private static boolean check(int x,int y,char c[][]){

			if((x>=0 && y>=0) && (x<c.length && y<c[0].length) && c[x][y]!='#'){

				return true;
			}
			return false;
		}
	    public int BFS(int x,int y,int k,char[][] c)
	    {
	    	 LinkedList<Pair> queue = new LinkedList<Pair>();
	        //Visited[s]=true;
	   //     queue.add(new Pair(x,y));
	       int count=0;
	   level[x][y]=-1;
	   c[x][y]='M';
	        while (!queue.isEmpty())
	        {
	            Pair temp = queue.poll();
	            //x=temp.idx;
	            //y=temp.val;

	            c[x][y]='M';
	      // System.out.println(x+" "+y+" ---"+count);
	         count++;
	     	if(count==k)
	         {
	         	for(int i=0;i<c.length;i++){
	         		for(int j=0;j<c[0].length;j++){
	         			if(c[i][j]=='M'){
	         				System.out.print(".");
	         			}
	         			else if(c[i][j]=='.')
	         				System.out.print("X");
	         			else
	         				System.out.print(c[i][j]);
	         		}
	         		System.out.println();
	         	}
	         System.exit(0);
	         }

	         // System.out.println(x+" "+y);
	           // V--;

	        }
	        return V;
	    }

	    private void getAns(int startVertex){
	    	for(int i=0;i<adj[startVertex].size();i++){
	    		int ch=adj[startVertex].get(i);
	    		for(int j=0;j<adj[ch].size();j++){
	    			int ch2=adj[ch].get(j);
	    			if(adj[ch2].contains(startVertex)){
	    				System.out.println(startVertex+" "+ch+" "+ch2);
	    				System.exit(0);
	    			}
	    		}
	    	}
	    }

	     public long dfs(int startVertex){
	    //	 getAns(startVertex);

	    	 if(!Visited[startVertex])  {

	   return dfsUtil(startVertex,Visited);
	    	//return getAns();
	    	}

	    return 0;
	    	}
	 private long dfsUtil(int startVertex, boolean[] Visited) {//0-Blue 1-Pink

		 int c=1;
		 long cout=0;
	      degree=0;
	    	Visited[startVertex]=true;
	    	lev_dfs[startVertex]=1;
	      st.push(startVertex);
	    while(!st.isEmpty()){

	    	int top=st.pop();
	    int child=adj[top].size();
	    if(top!=startVertex)
	    	child--;

	    	ts.add(top);
	    	Iterator<Integer> i=adj[top].listIterator();
	     degree+=adj[top].size();

	    while(i.hasNext()){
	    //	System.out.println(top);
	    	int n=i.next();
	     if( !Visited[n]){
	    				Visited[n]=true;
	    					st.push(n);
	    					if(adj[n].size()-1>child)
	    					cout++;
	    				c++;
	    					lev_dfs[n]=lev_dfs[top]+1;

	    		 }
	         }
	 }
	    return cout;

	  //  System.out.println("NO");
	   // return c;

	    }

	        }

	    class Dsu{
	    	private int rank[], parent[] ,n;

	    	Dsu(int size){
	    		this.n=size+1;
	    		rank=new int[n];
	    		parent=new int[n];
	    	makeSet();
	    	}

	    	void makeSet(){
	    		for(int i=0;i<n;i++){
	    			parent[i]=i;
	    		}
	    	}

	    	int find(int x){
	    		if(parent[x]!=x){

	    			parent[x]=find(parent[x]);
	    		}
	    		return parent[x];
	    	}

	    	void union(int x,int y){
	    		int xRoot=find(x);
	    		int yRoot=find(y);

	    		if(xRoot==yRoot)
	    			return;
	    		if(rank[xRoot]<rank[yRoot]){
	    		parent[xRoot]=yRoot;
	    		}else if(rank[yRoot]<rank[xRoot]){
	    			parent[yRoot]=xRoot;
	    		}else{
	    			parent[yRoot]=xRoot;
	    			rank[xRoot]++;
	    		}

	    	}

	    }
	    class Heap{

	    	public static void build_max_heap(long []a,int size){

	    		for(int i=size/2;i>0;i--){
	    			max_heapify(a, i,size);
	    		}

	    			}
	    	private static void max_heapify(long[] a,int i,int size){
	    		int left_child=2*i;
	    		int right_child=(2*i+1);
	    		int largest=0;

	    		if(left_child<size && a[left_child]>a[i]){
	    			largest=left_child;
	    		}else{
	    			largest=i;
	    		}

	    		if(right_child<size && a[right_child]>a[largest]){
	    			largest=right_child;
	    		}
	    		if(largest!=i){
	    			long temp=a[largest];
	    			a[largest]=a[i];
	    			a[i]=temp;
	    			max_heapify(a, largest,size);
	    		}
	    	}
	    	private static void min_heapify(int[] a,int i){
	    		int left_child=2*i;
	    		int right_child=(2*i+1);
	    		int largest=0;

	    		if(left_child<a.length && a[left_child]<a[i]){
	    			largest=left_child;
	    		}else{
	    			largest=i;
	    		}

	    		if(right_child<a.length && a[right_child]<a[largest]){
	    			largest=right_child;
	    		}
	    		if(largest!=i){
	    			int temp=a[largest];
	    			a[largest]=a[i];
	    			a[i]=temp;
	    			min_heapify(a, largest);
	    		}
	    	}
	    	public static void extract_max(int size,long a[]){
	    		if(a.length>1){
	    			long max=a[1];
	    			a[1]=a[a.length-1];
	    			size--;
	    			max_heapify(a, 1,a.length-1);
	    		}
	    	}
	    }

	    class MyComp implements Comparator<Long>{

			@Override
			public int compare(Long o1, Long o2) {
				if(o1<o2){
					return 1;
				}else if(o1>o2){
					return -1;
				}
				return 0;

			}
	    }


	    /*
	     * Author- Priyam Vora
	     * BTech 2nd Year DAIICT
	     */

	    import java.io.*;
	    import java.math.*;
	    import java.util.*;
	    import javax.print.attribute.SetOfIntegerSyntax;

	    public class Graph1 {
	    	private static InputStream stream;
	    	private static byte[] buf = new byte[1024];
	    	private static int curChar;
	    	private static int numChars;
	    	private static SpaceCharFilter filter;
	    	private static PrintWriter pw;
	    	private static long count = 0,mod=1000000007;
	    	private static TreeSet<Integer>ts[]=new TreeSet[200000];
	    	private static HashSet hs=new HashSet();

	    	public static void main(String args[]) throws Exception {
	    		InputReader(System.in);
	    		pw = new PrintWriter(System.out);
	    		//ans();
	    		soln();
	    		pw.close();
	    	}

	    	public static long gcd(long x, long y) {
	    		if (x == 0)
	    			return y;
	    		else
	    			return gcd( y % x,x);
	    	}

	    	private static int BinarySearch(int a[], int low, int high, int target) {
	    		if (low > high)
	    			return -1;
	    		int mid = low + (high - low) / 2;
	    		if (a[mid] == target)
	    			return mid;
	    		if (a[mid] > target)
	    			high = mid - 1;
	    		if (a[mid] < target)
	    			low = mid + 1;
	    		return BinarySearch(a, low, high, target);
	    	}

	    	public static String reverseString(String s) {
	    		StringBuilder sb = new StringBuilder(s);
	    		sb.reverse();
	    		return (sb.toString());
	    	}

	    	public static long pow(long n, long p) {
	    		if(p==0)
	    			return 1;
	    		if(p==1)
	    			return n%mod;
	    		if(p%2==0){
	    			long temp=pow(n, p/2);
	    		return (temp*temp)%mod;
	    		}else{
	    			 	long temp=pow(n,p/2);
	    			 	temp=(temp*temp)%mod;
	    			 	return(temp*n)%mod;

	    		}
	    	}

	    	public static int[] radixSort(int[] f) {
	    		int[] to = new int[f.length];
	    		{
	    			int[] b = new int[65537];
	    			for (int i = 0; i < f.length; i++)
	    				b[1 + (f[i] & 0xffff)]++;
	    			for (int i = 1; i <= 65536; i++)
	    				b[i] += b[i - 1];
	    			for (int i = 0; i < f.length; i++)
	    				to[b[f[i] & 0xffff]++] = f[i];
	    			int[] d = f;
	    			f = to;
	    			to = d;
	    		}
	    		{
	    			int[] b = new int[65537];
	    			for (int i = 0; i < f.length; i++)
	    				b[1 + (f[i] >>> 16)]++;
	    			for (int i = 1; i <= 65536; i++)
	    				b[i] += b[i - 1];
	    			for (int i = 0; i < f.length; i++)
	    				to[b[f[i] >>> 16]++] = f[i];
	    			int[] d = f;
	    			f = to;
	    			to = d;
	    		}
	    		return f;
	    	}

	    	public static int nextPowerOf2(final int a) {
	    		int b = 1;
	    		while (b < a) {
	    			b = b << 1;
	    		}
	    		return b;
	    	}

	    	public static boolean PointInTriangle(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
	    		int s = p2 * p5 - p1 * p6 + (p6 - p2) * p7 + (p1 - p5) * p8;
	    		int t = p1 * p4 - p2 * p3 + (p2 - p4) * p7 + (p3 - p1) * p8;

	    		if ((s < 0) != (t < 0))
	    			return false;

	    		int A = -p4 * p5 + p2 * (p5 - p3) + p1 * (p4 - p6) + p3 * p6;
	    		if (A < 0.0) {
	    			s = -s;
	    			t = -t;
	    			A = -A;
	    		}
	    		return s > 0 && t > 0 && (s + t) <= A;
	    	}

	    	public static float area(int x1, int y1, int x2, int y2, int x3, int y3) {
	    		return (float) Math.abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
	    	}

	    	public static boolean isPrime(int n) {
	    		// Corner cases
	    		if (n <= 1)
	    			return false;
	    		if (n <= 3)
	    			return true;

	    		// This is checked so that we can skip
	    		// middle five numbers in below loop
	    		if (n % 2 == 0 || n % 3 == 0)
	    			return false;

	    		for (int i = 5; i * i <= n; i = i + 6)
	    			if (n % i == 0 || n % (i + 2) == 0)
	    				return false;

	    		return true;
	    	}

	    	//merge Sort

	    	static long sort(int a[])
	    	{  int n=a.length;
	    		int b[]=new int[n];
	    		return mergeSort(a,b,0,n-1);}
	    	static long mergeSort(int a[],int b[],long left,long right)
	    	{ long c=0;if(left<right)
	    	 {   long mid=left+(right-left)/2;
	    		 c= mergeSort(a,b,left,mid);
	    		 c+=mergeSort(a,b,mid+1,right);
	    		 c+=merge(a,b,left,mid+1,right); }
	    		return c;	 }
	    	static long merge(int a[],int  b[],long left,long mid,long right)
	    	{long c=0;int i=(int)left;int j=(int)mid; int k=(int)left;
	    	while(i<=(int)mid-1&&j<=(int)right)
	    	{ if(a[i]>a[j]) {b[k++]=a[i++]; }
	    	else	{ b[k++]=a[j++];c+=mid-i;}}
	    	while (i <= (int)mid - 1)   b[k++] = a[i++];
	    	while (j <= (int)right) b[k++] = a[j++];
	    	for (i=(int)left; i <= (int)right; i++)
	    		a[i] = b[i];  return c;  }
	    	public static boolean isSubSequence(String large, String small, int largeLen, int smallLen) {
	    		//base cases
	    		if (largeLen == 0)
	    			return false;
	    		if (smallLen == 0)
	    			return true;
	    		// If last characters of two strings are matching
	    		if (large.charAt(largeLen - 1) == small.charAt(smallLen - 1))
	    			isSubSequence(large, small, largeLen - 1, smallLen - 1);
	    		// If last characters are not matching
	    		return isSubSequence(large, small, largeLen - 1, smallLen);
	    	}

	    	// To Get Input
	    	// Some Buffer Methods

	    	public static void InputReader(InputStream stream1) {
	    		stream = stream1;
	    	}

	    	private static boolean isWhitespace(int c) {
	    		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	    	}

	    	private static boolean isEndOfLine(int c) {
	    		return c == '\n' || c == '\r' || c == -1;
	    	}

	    	private static int read() {
	    		if (numChars == -1)
	    			throw new InputMismatchException();
	    		if (curChar >= numChars) {
	    			curChar = 0;
	    			try {
	    				numChars = stream.read(buf);
	    			} catch (IOException e) {
	    				throw new InputMismatchException();
	    			}
	    			if (numChars <= 0)
	    				return -1;
	    		}
	    		return buf[curChar++];
	    	}

	    	private static int nextInt() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		int sgn = 1;
	    		if (c == '-') {
	    			sgn = -1;
	    			c = read();
	    		}
	    		int res = 0;
	    		do {
	    			if (c < '0' || c > '9')
	    				throw new InputMismatchException();
	    			res *= 10;
	    			res += c - '0';
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res * sgn;
	    	}

	    	private static long nextLong() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		int sgn = 1;
	    		if (c == '-') {
	    			sgn = -1;
	    			c = read();
	    		}
	    		long res = 0;
	    		do {
	    			if (c < '0' || c > '9')
	    				throw new InputMismatchException();
	    			res *= 10;
	    			res += c - '0';
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res * sgn;
	    	}

	    	private static String nextToken() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		StringBuilder res = new StringBuilder();
	    		do {
	    			res.appendCodePoint(c);
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res.toString();
	    	}

	    	private static String nextLine() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		StringBuilder res = new StringBuilder();
	    		do {
	    			res.appendCodePoint(c);
	    			c = read();
	    		} while (!isEndOfLine(c));
	    		return res.toString();
	    	}

	    	private static int[] nextIntArray(int n) {
	    		int[] arr = new int[n];
	    		for (int i = 0; i < n; i++) {
	    			arr[i] = nextInt();
	    		}
	    		return arr;
	    	}

	    	private static int[][] next2dArray(int n, int m) {
	    		int[][] arr = new int[n][m];
	    		for (int i = 0; i < n; i++) {
	    			for (int j = 0; j < m; j++) {
	    				arr[i][j] = nextInt();
	    			}
	    		}
	    		return arr;
	    	}
	    	private static char[][] nextCharArray(int n,int m){
	    		char [][]c=new char[n][m];
	    		for(int i=0;i<n;i++){
	    			String s=nextLine();
	    			for(int j=0;j<s.length();j++){
	    				c[i][j]=s.charAt(j);
	    			}
	    		}
	    		return c;
	    	}

	    	private static long[] nextLongArray(int n) {
	    		long[] arr = new long[n];
	    		for (int i = 0; i < n; i++) {
	    			arr[i] = nextLong();
	    		}
	    		return arr;
	    	}

	    	private static void pArray(int[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static void pArray(long[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static void pArray(boolean[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static boolean isSpaceChar(int c) {
	    		if (filter != null)
	    			return filter.isSpaceChar(c);
	    		return isWhitespace(c);
	    	}

	    	private interface SpaceCharFilter {
	    		public boolean isSpaceChar(int ch);
	    	}

	    	//----------------------------------------My Code------------------------------------------------//

	    	private static void soln() {

	    	int n=nextInt();
	    	int a[]=nextIntArray(n);
	    	Arrays.sort(a);
	    	int neg=0;
	    	ArrayList<Integer> ar=new ArrayList<>();
	    	for(int i=0;i<n;i++){
	    		if(a[i]<0){
	    			neg++;
	    		}
	    		if(a[i]>0){
	    			ar.add(a[i]);
	    		}
	    	}
	    	if(neg%2!=0)
	    		neg--;
	    	int count=0;

	    	for(int i=0;i<n;i++){
	    		if(count==neg){
	    			break;
	    		}
	    		if(a[i]<0){
	    			count++;
	    			pw.print(a[i]+" ");
	    		}

	    	}
	    	for(int i=0;i<ar.size();i++){
	    		pw.print(ar.get(i)+" ");
	    	}
	    	}//-----------------------------------------The End--------------------------------------------------------------------------//

	 }

		class Pair implements Comparable<Pair>{
		    long id;
			long w;
			long h;
			Pair(long id,long w,long h){
				this.id=id;
				this.w=w;
				this.h=h;
			}
			@Override
			public int compareTo(Pair o) {
				// TODO Auto-generated method stub
			//	Sort in increasing order

				if(w>o.w)
					return 1;
				else if(w<o.w)
					return -1;
				else{
					if(h>o.h){
						return 1;
					}else if(o.h>h)
						return -1;
					else return 0;
				}

			}

		}
	        class Graph{
	        	private static int V,level[][],count=-1,lev_dfs[],degree=0,no_vert_conn_comp=0;
	        	private Stack <Integer>st=new Stack();
	        	private static LinkedList<Integer > adj[];
	        	private boolean[][] Visite;
	        	private static boolean [] Visited;
	        	private static TreeSet<Integer> ts=new TreeSet();
	    Graph(int V){
	    V++;
	    this.V=(V);
	    adj=new LinkedList[V];
	    Visite=new boolean[100][100];

 	   Visited=new boolean[V];
	    level=new int[100][100];
	   lev_dfs=new int[V];
	   for(int i=0;i<V;i++)
		   adj[i]=new LinkedList<Integer>();
	    }

	    void addEdge(int v,int w){

	    	if(adj[v]==null){
	    		adj[v]=new LinkedList();
	    	}
	    	adj[v].add(w);

	    }

	    public static int BFS2(int startVert,int dest){
	    	Visited=new boolean[V];
	    	for(int i=1;i<V;i++){
	    		lev_dfs[i]=-1;
	    	}
	    	Queue<Integer> q=new LinkedList<Integer>();
	    	q.add(startVert);

	    	lev_dfs[startVert]=0;
	    	while(!q.isEmpty()){
	    		int top=q.poll();

	    		Iterator<Integer> i= adj[top].listIterator();
	    		while(i.hasNext()){
	    			int n=i.next();
	    			if(!Visited[n]){
	    				q.add(n);
	    				Visited[n]=true;
	    				lev_dfs[n]=lev_dfs[top]+1;
	    			if(n==dest){
	    				q.clear();
	    				return lev_dfs[n];

	    			}
	    			}
	    		}
	    	}
	    	q.clear();
	    	return -1;
	    }
	    public int getEd(){
	    	return degree/2;
	    }
	    public void get(int from,int to){
	    	int h=lev_dfs[from]-lev_dfs[to];
	    	if(h<=0){
	    		System.out.println(-1);
	    	}else{
	    		System.out.println(h-1);
	    	}
	    }
	    private static boolean check(int x,int y,char c[][]){

			if((x>=0 && y>=0) && (x<c.length && y<c[0].length) && c[x][y]!='#'){

				return true;
			}
			return false;
		}
	    public int BFS(int x,int y,int k,char[][] c)
	    {
	    	 LinkedList<Pair> queue = new LinkedList<Pair>();
	        //Visited[s]=true;
	   //     queue.add(new Pair(x,y));
	       int count=0;
	   level[x][y]=-1;
	   c[x][y]='M';
	        while (!queue.isEmpty())
	        {
	            Pair temp = queue.poll();
	            //x=temp.idx;
	            //y=temp.val;

	            c[x][y]='M';
	      // System.out.println(x+" "+y+" ---"+count);
	         count++;
	     	if(count==k)
	         {
	         	for(int i=0;i<c.length;i++){
	         		for(int j=0;j<c[0].length;j++){
	         			if(c[i][j]=='M'){
	         				System.out.print(".");
	         			}
	         			else if(c[i][j]=='.')
	         				System.out.print("X");
	         			else
	         				System.out.print(c[i][j]);
	         		}
	         		System.out.println();
	         	}
	         System.exit(0);
	         }

	         // System.out.println(x+" "+y);
	           // V--;

	        }
	        return V;
	    }

	    private void getAns(int startVertex){
	    	for(int i=0;i<adj[startVertex].size();i++){
	    		int ch=adj[startVertex].get(i);
	    		for(int j=0;j<adj[ch].size();j++){
	    			int ch2=adj[ch].get(j);
	    			if(adj[ch2].contains(startVertex)){
	    				System.out.println(startVertex+" "+ch+" "+ch2);
	    				System.exit(0);
	    			}
	    		}
	    	}
	    }

	     public long dfs(int startVertex){
	    //	 getAns(startVertex);

	    	 if(!Visited[startVertex])  {

	   return dfsUtil(startVertex,Visited);
	    	//return getAns();
	    	}

	    return 0;
	    	}
	 private long dfsUtil(int startVertex, boolean[] Visited) {//0-Blue 1-Pink

		 int c=1;
		 long cout=0;
	      degree=0;
	    	Visited[startVertex]=true;
	    	lev_dfs[startVertex]=1;
	      st.push(startVertex);
	    while(!st.isEmpty()){

	    	int top=st.pop();
	    int child=adj[top].size();
	    if(top!=startVertex)
	    	child--;

	    	ts.add(top);
	    	Iterator<Integer> i=adj[top].listIterator();
	     degree+=adj[top].size();

	    while(i.hasNext()){
	    //	System.out.println(top);
	    	int n=i.next();
	     if( !Visited[n]){
	    				Visited[n]=true;
	    					st.push(n);
	    					if(adj[n].size()-1>child)
	    					cout++;
	    				c++;
	    					lev_dfs[n]=lev_dfs[top]+1;

	    		 }
	         }
	 }
	    return cout;

	  //  System.out.println("NO");
	   // return c;

	    }

	        }

	    class Dsu{
	    	private int rank[], parent[] ,n;

	    	Dsu(int size){
	    		this.n=size+1;
	    		rank=new int[n];
	    		parent=new int[n];
	    	makeSet();
	    	}

	    	void makeSet(){
	    		for(int i=0;i<n;i++){
	    			parent[i]=i;
	    		}
	    	}

	    	int find(int x){
	    		if(parent[x]!=x){

	    			parent[x]=find(parent[x]);
	    		}
	    		return parent[x];
	    	}

	    	void union(int x,int y){
	    		int xRoot=find(x);
	    		int yRoot=find(y);

	    		if(xRoot==yRoot)
	    			return;
	    		if(rank[xRoot]<rank[yRoot]){
	    		parent[xRoot]=yRoot;
	    		}else if(rank[yRoot]<rank[xRoot]){
	    			parent[yRoot]=xRoot;
	    		}else{
	    			parent[yRoot]=xRoot;
	    			rank[xRoot]++;
	    		}

	    	}

	    }
	    class Heap{

	    	public static void build_max_heap(long []a,int size){

	    		for(int i=size/2;i>0;i--){
	    			max_heapify(a, i,size);
	    		}

	    			}
	    	private static void max_heapify(long[] a,int i,int size){
	    		int left_child=2*i;
	    		int right_child=(2*i+1);
	    		int largest=0;

	    		if(left_child<size && a[left_child]>a[i]){
	    			largest=left_child;
	    		}else{
	    			largest=i;
	    		}

	    		if(right_child<size && a[right_child]>a[largest]){
	    			largest=right_child;
	    		}
	    		if(largest!=i){
	    			long temp=a[largest];
	    			a[largest]=a[i];
	    			a[i]=temp;
	    			max_heapify(a, largest,size);
	    		}
	    	}
	    	private static void min_heapify(int[] a,int i){
	    		int left_child=2*i;
	    		int right_child=(2*i+1);
	    		int largest=0;

	    		if(left_child<a.length && a[left_child]<a[i]){
	    			largest=left_child;
	    		}else{
	    			largest=i;
	    		}

	    		if(right_child<a.length && a[right_child]<a[largest]){
	    			largest=right_child;
	    		}
	    		if(largest!=i){
	    			int temp=a[largest];
	    			a[largest]=a[i];
	    			a[i]=temp;
	    			min_heapify(a, largest);
	    		}
	    	}
	    	public static void extract_max(int size,long a[]){
	    		if(a.length>1){
	    			long max=a[1];
	    			a[1]=a[a.length-1];
	    			size--;
	    			max_heapify(a, 1,a.length-1);
	    		}
	    	}
	    }

	    class MyComp implements Comparator<Long>{

			@Override
			public int compare(Long o1, Long o2) {
				if(o1<o2){
					return 1;
				}else if(o1>o2){
					return -1;
				}
				return 0;

			}
	    }


	    /*
	     * Author- Priyam Vora
	     * BTech 2nd Year DAIICT
	     */

	    import java.io.*;
	    import java.math.*;
	    import java.util.*;
	    import javax.print.attribute.SetOfIntegerSyntax;

	    public class Graph1 {
	    	private static InputStream stream;
	    	private static byte[] buf = new byte[1024];
	    	private static int curChar;
	    	private static int numChars;
	    	private static SpaceCharFilter filter;
	    	private static PrintWriter pw;
	    	private static long count = 0,mod=1000000007;
	    	private static TreeSet<Integer>ts[]=new TreeSet[200000];
	    	private static HashSet hs=new HashSet();

	    	public static void main(String args[]) throws Exception {
	    		InputReader(System.in);
	    		pw = new PrintWriter(System.out);
	    		//ans();
	    		soln();
	    		pw.close();
	    	}

	    	public static long gcd(long x, long y) {
	    		if (x == 0)
	    			return y;
	    		else
	    			return gcd( y % x,x);
	    	}

	    	private static int BinarySearch(int a[], int low, int high, int target) {
	    		if (low > high)
	    			return -1;
	    		int mid = low + (high - low) / 2;
	    		if (a[mid] == target)
	    			return mid;
	    		if (a[mid] > target)
	    			high = mid - 1;
	    		if (a[mid] < target)
	    			low = mid + 1;
	    		return BinarySearch(a, low, high, target);
	    	}

	    	public static String reverseString(String s) {
	    		StringBuilder sb = new StringBuilder(s);
	    		sb.reverse();
	    		return (sb.toString());
	    	}

	    	public static long pow(long n, long p) {
	    		if(p==0)
	    			return 1;
	    		if(p==1)
	    			return n%mod;
	    		if(p%2==0){
	    			long temp=pow(n, p/2);
	    		return (temp*temp)%mod;
	    		}else{
	    			 	long temp=pow(n,p/2);
	    			 	temp=(temp*temp)%mod;
	    			 	return(temp*n)%mod;

	    		}
	    	}

	    	public static int[] radixSort(int[] f) {
	    		int[] to = new int[f.length];
	    		{
	    			int[] b = new int[65537];
	    			for (int i = 0; i < f.length; i++)
	    				b[1 + (f[i] & 0xffff)]++;
	    			for (int i = 1; i <= 65536; i++)
	    				b[i] += b[i - 1];
	    			for (int i = 0; i < f.length; i++)
	    				to[b[f[i] & 0xffff]++] = f[i];
	    			int[] d = f;
	    			f = to;
	    			to = d;
	    		}
	    		{
	    			int[] b = new int[65537];
	    			for (int i = 0; i < f.length; i++)
	    				b[1 + (f[i] >>> 16)]++;
	    			for (int i = 1; i <= 65536; i++)
	    				b[i] += b[i - 1];
	    			for (int i = 0; i < f.length; i++)
	    				to[b[f[i] >>> 16]++] = f[i];
	    			int[] d = f;
	    			f = to;
	    			to = d;
	    		}
	    		return f;
	    	}

	    	public static int nextPowerOf2(final int a) {
	    		int b = 1;
	    		while (b < a) {
	    			b = b << 1;
	    		}
	    		return b;
	    	}

	    	public static boolean PointInTriangle(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8) {
	    		int s = p2 * p5 - p1 * p6 + (p6 - p2) * p7 + (p1 - p5) * p8;
	    		int t = p1 * p4 - p2 * p3 + (p2 - p4) * p7 + (p3 - p1) * p8;

	    		if ((s < 0) != (t < 0))
	    			return false;

	    		int A = -p4 * p5 + p2 * (p5 - p3) + p1 * (p4 - p6) + p3 * p6;
	    		if (A < 0.0) {
	    			s = -s;
	    			t = -t;
	    			A = -A;
	    		}
	    		return s > 0 && t > 0 && (s + t) <= A;
	    	}

	    	public static float area(int x1, int y1, int x2, int y2, int x3, int y3) {
	    		return (float) Math.abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0);
	    	}

	    	public static boolean isPrime(int n) {
	    		// Corner cases
	    		if (n <= 1)
	    			return false;
	    		if (n <= 3)
	    			return true;

	    		// This is checked so that we can skip
	    		// middle five numbers in below loop
	    		if (n % 2 == 0 || n % 3 == 0)
	    			return false;

	    		for (int i = 5; i * i <= n; i = i + 6)
	    			if (n % i == 0 || n % (i + 2) == 0)
	    				return false;

	    		return true;
	    	}

	    	//merge Sort

	    	static long sort(int a[])
	    	{  int n=a.length;
	    		int b[]=new int[n];
	    		return mergeSort(a,b,0,n-1);}
	    	static long mergeSort(int a[],int b[],long left,long right)
	    	{ long c=0;if(left<right)
	    	 {   long mid=left+(right-left)/2;
	    		 c= mergeSort(a,b,left,mid);
	    		 c+=mergeSort(a,b,mid+1,right);
	    		 c+=merge(a,b,left,mid+1,right); }
	    		return c;	 }
	    	static long merge(int a[],int  b[],long left,long mid,long right)
	    	{long c=0;int i=(int)left;int j=(int)mid; int k=(int)left;
	    	while(i<=(int)mid-1&&j<=(int)right)
	    	{ if(a[i]>a[j]) {b[k++]=a[i++]; }
	    	else	{ b[k++]=a[j++];c+=mid-i;}}
	    	while (i <= (int)mid - 1)   b[k++] = a[i++];
	    	while (j <= (int)right) b[k++] = a[j++];
	    	for (i=(int)left; i <= (int)right; i++)
	    		a[i] = b[i];  return c;  }
	    	public static boolean isSubSequence(String large, String small, int largeLen, int smallLen) {
	    		//base cases
	    		if (largeLen == 0)
	    			return false;
	    		if (smallLen == 0)
	    			return true;
	    		// If last characters of two strings are matching
	    		if (large.charAt(largeLen - 1) == small.charAt(smallLen - 1))
	    			isSubSequence(large, small, largeLen - 1, smallLen - 1);
	    		// If last characters are not matching
	    		return isSubSequence(large, small, largeLen - 1, smallLen);
	    	}

	    	// To Get Input
	    	// Some Buffer Methods

	    	public static void InputReader(InputStream stream1) {
	    		stream = stream1;
	    	}

	    	private static boolean isWhitespace(int c) {
	    		return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
	    	}

	    	private static boolean isEndOfLine(int c) {
	    		return c == '\n' || c == '\r' || c == -1;
	    	}

	    	private static int read() {
	    		if (numChars == -1)
	    			throw new InputMismatchException();
	    		if (curChar >= numChars) {
	    			curChar = 0;
	    			try {
	    				numChars = stream.read(buf);
	    			} catch (IOException e) {
	    				throw new InputMismatchException();
	    			}
	    			if (numChars <= 0)
	    				return -1;
	    		}
	    		return buf[curChar++];
	    	}

	    	private static int nextInt() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		int sgn = 1;
	    		if (c == '-') {
	    			sgn = -1;
	    			c = read();
	    		}
	    		int res = 0;
	    		do {
	    			if (c < '0' || c > '9')
	    				throw new InputMismatchException();
	    			res *= 10;
	    			res += c - '0';
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res * sgn;
	    	}

	    	private static long nextLong() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		int sgn = 1;
	    		if (c == '-') {
	    			sgn = -1;
	    			c = read();
	    		}
	    		long res = 0;
	    		do {
	    			if (c < '0' || c > '9')
	    				throw new InputMismatchException();
	    			res *= 10;
	    			res += c - '0';
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res * sgn;
	    	}

	    	private static String nextToken() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		StringBuilder res = new StringBuilder();
	    		do {
	    			res.appendCodePoint(c);
	    			c = read();
	    		} while (!isSpaceChar(c));
	    		return res.toString();
	    	}

	    	private static String nextLine() {
	    		int c = read();
	    		while (isSpaceChar(c))
	    			c = read();
	    		StringBuilder res = new StringBuilder();
	    		do {
	    			res.appendCodePoint(c);
	    			c = read();
	    		} while (!isEndOfLine(c));
	    		return res.toString();
	    	}

	    	private static int[] nextIntArray(int n) {
	    		int[] arr = new int[n];
	    		for (int i = 0; i < n; i++) {
	    			arr[i] = nextInt();
	    		}
	    		return arr;
	    	}

	    	private static int[][] next2dArray(int n, int m) {
	    		int[][] arr = new int[n][m];
	    		for (int i = 0; i < n; i++) {
	    			for (int j = 0; j < m; j++) {
	    				arr[i][j] = nextInt();
	    			}
	    		}
	    		return arr;
	    	}
	    	private static char[][] nextCharArray(int n,int m){
	    		char [][]c=new char[n][m];
	    		for(int i=0;i<n;i++){
	    			String s=nextLine();
	    			for(int j=0;j<s.length();j++){
	    				c[i][j]=s.charAt(j);
	    			}
	    		}
	    		return c;
	    	}

	    	private static long[] nextLongArray(int n) {
	    		long[] arr = new long[n];
	    		for (int i = 0; i < n; i++) {
	    			arr[i] = nextLong();
	    		}
	    		return arr;
	    	}

	    	private static void pArray(int[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static void pArray(long[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static void pArray(boolean[] arr) {
	    		for (int i = 0; i < arr.length; i++) {
	    			pw.print(arr[i] + " ");
	    		}
	    		pw.println();
	    		return;
	    	}

	    	private static boolean isSpaceChar(int c) {
	    		if (filter != null)
	    			return filter.isSpaceChar(c);
	    		return isWhitespace(c);
	    	}

	    	private interface SpaceCharFilter {
	    		public boolean isSpaceChar(int ch);
	    	}

	    	//----------------------------------------My Code------------------------------------------------//

	    	private static void soln() {

	    	int n=nextInt();
	    	int a[]=nextIntArray(n);
	    	Arrays.sort(a);
	    	int neg=0;
	    	int zero=0;
	    	ArrayList<Integer> ar=new ArrayList<>();
	    	for(int i=0;i<n;i++){
	    		if(a[i]<0){
	    			neg++;
	    		}
	    		if(a[i]>0){
	    			ar.add(a[i]);
	    		}
	    		if(a[i]==0)
	    			zero++;
	    	}
	    	if(neg%2!=0)
	    		neg--;
	    	int count=0;

	    	for(int i=0;i<n;i++){
	    		if(count==neg){
	    			break;
	    		}
	    		if(a[i]<0){
	    			count++;
	    			ar.add(a[i]);
	    		}

	    	}
	    	for(int i=0;i<ar.size();i++){
	    		pw.print(ar.get(i)+" ");
	    	}
	    	if(ar.size()==0 && neg==0){

	    		if(zero==0)
	    		pw.println(a[0]);
	    		else{
	    			pw.println(0);
	    		}
	    	}
	    	}//-----------------------------------------The End--------------------------------------------------------------------------//

	 }

		class Pair implements Comparable<Pair>{
		    long id;
			long w;
			long h;
			Pair(long id,long w,long h){
				this.id=id;
				this.w=w;
				this.h=h;
			}
			@Override
			public int compareTo(Pair o) {
				// TODO Auto-generated method stub
			//	Sort in increasing order

				if(w>o.w)
					return 1;
				else if(w<o.w)
					return -1;
				else{
					if(h>o.h){
						return 1;
					}else if(o.h>h)
						return -1;
					else return 0;
				}

			}

		}
	        class Graph{
	        	private static int V,level[][],count=-1,lev_dfs[],degree=0,no_vert_conn_comp=0;
	        	private Stack <Integer>st=new Stack();
	        	private static LinkedList<Integer > adj[];
	        	private boolean[][] Visite;
	        	private static boolean [] Visited;
	        	private static TreeSet<Integer> ts=new TreeSet();
	    Graph(int V){
	    V++;
	    this.V=(V);
	    adj=new LinkedList[V];
	    Visite=new boolean[100][100];

 	   Visited=new boolean[V];
	    level=new int[100][100];
	   lev_dfs=new int[V];
	   for(int i=0;i<V;i++)
		   adj[i]=new LinkedList<Integer>();
	    }

	    void addEdge(int v,int w){

	    	if(adj[v]==null){
	    		adj[v]=new LinkedList();
	    	}
	    	adj[v].add(w);

	    }

	    public static int BFS2(int startVert,int dest){
	    	Visited=new boolean[V];
	    	for(int i=1;i<V;i++){
	    		lev_dfs[i]=-1;
	    	}
	    	Queue<Integer> q=new LinkedList<Integer>();
	    	q.add(startVert);

	    	lev_dfs[startVert]=0;
	    	while(!q.isEmpty()){
	    		int top=q.poll();

	    		Iterator<Integer> i= adj[top].listIterator();
	    		while(i.hasNext()){
	    			int n=i.next();
	    			if(!Visited[n]){
	    				q.add(n);
	    				Visited[n]=true;
	    				lev_dfs[n]=lev_dfs[top]+1;
	    			if(n==dest){
	    				q.clear();
	    				return lev_dfs[n];

	    			}
	    			}
	    		}
	    	}
	    	q.clear();
	    	return -1;
	    }
	    public int getEd(){
	    	return degree/2;
	    }
	    public void get(int from,int to){
	    	int h=lev_dfs[from]-lev_dfs[to];
	    	if(h<=0){
	    		System.out.println(-1);
	    	}else{
	    		System.out.println(h-1);
	    	}
	    }
	    private static boolean check(int x,int y,char c[][]){

			if((x>=0 && y>=0) && (x<c.length && y<c[0].length) && c[x][y]!='#'){

				return true;
			}
			return false;
		}
	    public int BFS(int x,int y,int k,char[][] c)
	    {
	    	 LinkedList<Pair> queue = new LinkedList<Pair>();
	        //Visited[s]=true;
	   //     queue.add(new Pair(x,y));
	       int count=0;
	   level[x][y]=-1;
	   c[x][y]='M';
	        while (!queue.isEmpty())
	        {
	            Pair temp = queue.poll();
	            //x=temp.idx;
	            //y=temp.val;

	            c[x][y]='M';
	      // System.out.println(x+" "+y+" ---"+count);
	         count++;
	     	if(count==k)
	         {
	         	for(int i=0;i<c.length;i++){
	         		for(int j=0;j<c[0].length;j++){
	         			if(c[i][j]=='M'){
	         				System.out.print(".");
	         			}
	         			else if(c[i][j]=='.')
	         				System.out.print("X");
	         			else
	         				System.out.print(c[i][j]);
	         		}
	         		System.out.println();
	         	}
	         System.exit(0);
	         }

	         // System.out.println(x+" "+y);
	           // V--;

	        }
	        return V;
	    }

	    private void getAns(int startVertex){
	    	for(int i=0;i<adj[startVertex].size();i++){
	    		int ch=adj[startVertex].get(i);
	    		for(int j=0;j<adj[ch].size();j++){
	    			int ch2=adj[ch].get(j);
	    			if(adj[ch2].contains(startVertex)){
	    				System.out.println(startVertex+" "+ch+" "+ch2);
	    				System.exit(0);
	    			}
	    		}
	    	}
	    }

	     public long dfs(int startVertex){
	    //	 getAns(startVertex);

	    	 if(!Visited[startVertex])  {

	   return dfsUtil(startVertex,Visited);
	    	//return getAns();
	    	}

	    return 0;
	    	}
	 private long dfsUtil(int startVertex, boolean[] Visited) {//0-Blue 1-Pink

		 int c=1;
		 long cout=0;
	      degree=0;
	    	Visited[startVertex]=true;
	    	lev_dfs[startVertex]=1;
	      st.push(startVertex);
	    while(!st.isEmpty()){

	    	int top=st.pop();
	    int child=adj[top].size();
	    if(top!=startVertex)
	    	child--;

	    	ts.add(top);
	    	Iterator<Integer> i=adj[top].listIterator();
	     degree+=adj[top].size();

	    while(i.hasNext()){
	    //	System.out.println(top);
	    	int n=i.next();
	     if( !Visited[n]){
	    				Visited[n]=true;
	    					st.push(n);
	    					if(adj[n].size()-1>child)
	    					cout++;
	    				c++;
	    					lev_dfs[n]=lev_dfs[top]+1;

	    		 }
	         }
	 }
	    return cout;

	  //  System.out.println("NO");
	   // return c;

	    }

	        }

	    class Dsu{
	    	private int rank[], parent[] ,n;

	    	Dsu(int size){
	    		this.n=size+1;
	    		rank=new int[n];
	    		parent=new int[n];
	    	makeSet();
	    	}

	    	void makeSet(){
	    		for(int i=0;i<n;i++){
	    			parent[i]=i;
	    		}
	    	}

	    	int find(int x){
	    		if(parent[x]!=x){

	    			parent[x]=find(parent[x]);
	    		}
	    		return parent[x];
	    	}

	    	void union(int x,int y){
	    		int xRoot=find(x);
	    		int yRoot=find(y);

	    		if(xRoot==yRoot)
	    			return;
	    		if(rank[xRoot]<rank[yRoot]){
	    		parent[xRoot]=yRoot;
	    		}else if(rank[yRoot]<rank[xRoot]){
	    			parent[yRoot]=xRoot;
	    		}else{
	    			parent[yRoot]=xRoot;
	    			rank[xRoot]++;
	    		}

	    	}

	    }
	    class Heap{

	    	public static void build_max_heap(long []a,int size){

	    		for(int i=size/2;i>0;i--){
	    			max_heapify(a, i,size);
	    		}

	    			}
	    	private static void max_heapify(long[] a,int i,int size){
	    		int left_child=2*i;
	    		int right_child=(2*i+1);
	    		int largest=0;

	    		if(left_child<size && a[left_child]>a[i]){
	    			largest=left_child;
	    		}else{
	    			largest=i;
	    		}

	    		if(right_child<size && a[right_child]>a[largest]){
	    			largest=right_child;
	    		}
	    		if(largest!=i){
	    			long temp=a[largest];
	    			a[largest]=a[i];
	    			a[i]=temp;
	    			max_heapify(a, largest,size);
	    		}
	    	}
	    	private static void min_heapify(int[] a,int i){
	    		int left_child=2*i;
	    		int right_child=(2*i+1);
	    		int largest=0;

	    		if(left_child<a.length && a[left_child]<a[i]){
	    			largest=left_child;
	    		}else{
	    			largest=i;
	    		}

	    		if(right_child<a.length && a[right_child]<a[largest]){
	    			largest=right_child;
	    		}
	    		if(largest!=i){
	    			int temp=a[largest];
	    			a[largest]=a[i];
	    			a[i]=temp;
	    			min_heapify(a, largest);
	    		}
	    	}
	    	public static void extract_max(int size,long a[]){
	    		if(a.length>1){
	    			long max=a[1];
	    			a[1]=a[a.length-1];
	    			size--;
	    			max_heapify(a, 1,a.length-1);
	    		}
	    	}
	    }

	    class MyComp implements Comparator<Long>{

			@Override
			public int compare(Long o1, Long o2) {
				if(o1<o2){
					return 1;
				}else if(o1>o2){
					return -1;
				}
				return 0;

			}
	    }