#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <cassert>
#include <algorithm>
#include <iomanip>
#include <ctime>
#include <cmath>
#include <bitset>

#pragma comment(linker, "/STACK:256000000")

using namespace std;

typedef long long int int64;
typedef long double double80;

const int INF = (1 << 29) + 5;
const int64 LLINF = (1ll << 59) + 5;
const int MOD = 1000 * 1000 * 1000 + 7;
const int n = 6666;

struct point
{
	int x;
	int number;
};

point arr[n];
point newArr[n];

int check(point arr[])
{
	int answer = 0;
	for (int i = 0; i < 2016; ++i)
	{
		answer += arr[i].x;
	}

	return answer % 2016;
}

void suffle(int col, point arr[])
{
	for (int i = 0; i < col; ++i)
	{
		swap(arr[rand() % n], arr[rand() % n]);
	}
}

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

	for (int i = 0; i < n; ++i)
	{
		scanf("%d", &arr[i].x);
		arr[i].number = i + 1;
	}

	srand(0);
	random_shuffle(arr, arr + n);

	int now = check(arr);
	double mod = 0.98;
	double T = 2000;
	int NewE;
	double good;


	while (now != 0)
	{
		for (int i = 0; i < n; ++i)
		{
			newArr[i] = arr[i];
		}

		suffle(ceil(T), newArr);

		NewE = check(newArr);

		good = min(exp(-(NewE - now) / T), 1.0);

		if (good > (double)rand() / (double)RAND_MAX)
		{
			now = NewE;
			for (int i = 0; i < n; ++i)
			{
				arr[i] = newArr[i];
			}
		}

		T *= mod;

	}


	for (int i = 0; i < 2016; ++i)
	{
		printf("%d\n", arr[i].number);
	}


	fclose(stdin);
	fclose(stdout);

	return 0;
}