//Konrad Paluszek,University of Warsaw(former XIV LO Staszic)
//#STAY AT HOME
#ifndef LOCAL
#pragma GCC optimize("O3")
#endif
#define TIME (chrono::steady_clock::now().time_since_epoch().count())
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define xfm(a,b)a##b
#define xwb(a,b)xfm(a,b)
#define _ xwb(nvj,__LINE__)
#define __ xwb(kjy,__LINE__)
#define ___ xwb(cjm,__LINE__)
#define REP(i,n)for(urs(n)i=0;i<(n);++i)
#define UNTIL(t)while(clock()<(t)*CLOCKS_PER_SEC)
#define PER(r...)for(bool _=1;_||next_permutation(r);_=false)
#define ALL(r)(r).begin(),(r).end()
#define RALL(r)(r).rbegin(),(r).rend()
#define FS(r)r.first,r.second
#define SF(r)r.second,r.first
#define M0(r) memset(r, 0, sizeof(r))
#define sim template<class c
#define ros return o
#define rans return ans
#define forbits(i,m)if(m)for(urs(m)i=ctz(m),i##nvj=m;i##nvj;i##nvj^=((urs(m))1<<i),i=ctz(i##nvj))
#define fordbits(i,m)if(m)for(urs(m)i=8*sizeof(m)-clz(m)-1,i##nxd=m;i##nxd;i##nxd^=((urs(m))1<<i),i=8*sizeof(m)-clz(i##nxd)-1)
#define ksets(t, m, k, n) for (t m = (((t)1 << (k)) - 1); m < ((t)1 << (n)); m = nux(m))
#define urs(r...)typename decay<decltype(r)>::type
#define hur(f,g,r)sim>int f(c a){if(sizeof(c)==16)return r;if(sizeof(c)==8)return g##ll(a);return g(a);}
#define pwq(t,i) int clz(t x){return clz<int>(x)-i;}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
using namespace __gnu_pbds;using namespace std;using ll=long long;using ld=long double;using ull=unsigned long long;using vi=vector<int>;using vll=vector<ll>;using pii=pair<int,int>;using pll=pair<ll,ll>;using vpii=vector<pii>;using spii=set<pii>;using mii=map<int,int>;using unt=unsigned int;sim>using min_queue=priority_queue<c,vector<c>,greater<c>>;sim,class b,class cmp=less<c> >using ordered_map=tree<c,b,cmp,rb_tree_tag,tree_order_statistics_node_update>;sim, class cmp=less<c>>using ordered_set = ordered_map<c,null_type,cmp>;hur(popc,__builtin_popcount,popc<ull>(a)+popc<ull>(a>>64))hur(ctz,__builtin_ctz,(ull)a?ctz<ull>(a):64+ctz<ull>(a>>64))hur(clz,__builtin_clz,a>>64?clz<ull>(a>>64):64+clz<ull>(a))pwq(short,16)pwq(uint16_t,16)pwq(char,24)pwq(int8_t,24)pwq(uint8_t,24)sim,class N>bool mini(c&o,const N&h){if(o>h)ros=h,1;return 0;}sim,class N>bool maxi(c&o,const N&h){if(o<h)ros=h,1;return 0;}sim,class n>using gyv=c;
#if defined(LOCAL) // || defined(LOCAL2)
#include </home/kjp/headers/debuglib.hpp>
#else
#define loc(...)
#define onl(r...)r
#define debug(...)
#define print_stack(...)
#define mark_stack(...)
#define set_pre(...)
#define reg_it(...)
#define def_op(...) struct _{};
#if !defined(LOCAL) && !defined(LOCAL2)
#define exit my_exit
void my_exit(int x) {fflush(stdout);_Exit(x);}
#endif
#endif
#define next nexT
#define prev preV
#define tree trEE
#define left lefT
#define right righT
#define div diV
#define y1 y_1
#define pow do not use cmath pow unless you know what you are doing
ull mix(ull o){o+=0x9e3779b97f4a7c15;o=(o^(o>>30))*0xbf58476d1ce4e5b9;o=(o^(o>>27))*0x94d049bb133111eb;ros^(o>>31);}ull SALT=0x7a14a4b0881ebf9,tqu=0x7a14a4b0881ebf9;ull my_rand(){return tqu=mix(tqu);}void my_srand(ull x){SALT=tqu=x;}const int inf = 1023400000;const ll llinf=1234567890000000000ll;ll fix(ll o, ll m){o%=m;if(o<0)o+=m;ros;}
#define rand my_rand
#define srand my_srand
#define random_shuffle(r...)random_shuffle(r,[](int _){return my_rand()%_;})
sim>inline c nux(c m){if(!m)return numeric_limits<c>::max();c A=m&-m;c B=~((A-1)^m);c C=B&-B;c D=(C>>(1+ctz(A)))-1;return C|(m&~(C-1))|D;}__attribute__((no_sanitize_undefined))ll mul(ll a,ll b,ll m){ll q=(ll)(a*(ld)b/m);ll o=a*b-q*m;o%=m;if(o<0)o+=m;ros;}sim>void unq(c&x){x.resize(unique(ALL(x))-x.begin());}
#pragma GCC diagnostic pop
#if ((ULONG_MAX) != (UINT_MAX))
namespace std {template <> struct is_signed<__int128> : public true_type {};}
#endif
sim, class d> typename common_type<c,d>::type floor_div(c a, d b) {static_assert(is_signed<c>::value==is_signed<d>::value,"using floor_div with different signedness");if (b < 0) b = -b, a = -a;return a / b - (a % b < 0);}
sim, class d> typename common_type<c,d>::type ceil_div(c a, d b) {static_assert(is_signed<c>::value==is_signed<d>::value,"using ceil_div with different signedness");if (b < 0) b = -b, a = -a;return a / b + (a % b > 0);}
sim> struct REV {using value_type=typename c::value_type;c &x;using it=typename c::reverse_iterator;it begin(){return x.rbegin();}it end(){return x.rend();}};
sim> struct CREV {using value_type=typename c::value_type;const c&x;using it=typename c::const_reverse_iterator;it begin(){return x.rbegin();}it end(){return x.rend();}};
sim> REV<c> reversed(c&x) {return REV<c>{x};}sim> CREV<c> reversed(const c&x) {return CREV<c>{x};}
#define done(r...) exit(0 * printf(r))
#if defined(LOCAL) || defined(LOCAL2)
void __tmi() {cerr << setprecision(6) << fixed << "total time: " << clock() / (ld)CLOCKS_PER_SEC << "s" << endl;}int _ = (atexit(__tmi), 0);
#endif
//#STAY AT HOME
const int types = 26, dax = 366;
int days;
int c[types];
int s[dax][types];
int score(const vi &v) {
	assert((int)v.size() == days);
	int last[types];
	memset(last, -1, sizeof(last));
	int ans = 0;
	REP(d, days) {
		int i = v[d];
		ans += s[d][i];
		last[i] = d;
		REP(j, types) ans -= c[j] * (d - last[j]);
	}
	rans;
}
/* HUNGARIAN O(n^3).                                                          */
/* Maksymalne najdroższe skojarzenie w pełnym grafie dwudzielnym o            */
/* równolicznych zbiorach wierzchołków.  Argumenty to macierz z wagami        */
/* i liczba wierzchołków.  Zwracany wynik to wektor, który mówi co jest       */
/* z czym skojarzone.                                                         */
/* Jak chcemy najtańsze to bierzemy wszystko z minusem, jak gdzieś nie ma     */
/* krawędzi to dajemy -INF, przy zalozeniu, ze: n * |waga| < INF.             */
/* Wszystko w wektorze indeksujemy od 0.                                      */

vector<int> hungarian(const vector<vector<int>>& w, int n) {
  int lx[n], ly[n], skojx[n], skojy[n];
  int markx[n], marky[n], slack[n], par[n], q[n];
  for (int i = 0; i < n; i++) {
    skojx[i] = skojy[i] = -1;
    ly[i] = 0;
    lx[i] = *max_element(w[i].begin(), w[i].end());
  }
  for (int k = 0; k < n; k++) {
    int v = -1, qb = 0, qe = 0;
    for (int i = 0; i < n; i++) {
      marky[i] = markx[i] = 0;
      slack[i] = -1;
      if (skojx[i] == -1)
        q[qe++] = i;
    }
    while (v == -1) {
      while (qb < qe) {
        int i = q[qb++];
        markx[i] = 1;
        for (int j = 0; j < n; j++) {
          if (!marky[j] && (slack[j] == -1 ||
              slack[j] > lx[i] + ly[j] - w[i][j])) {
            if ((slack[j] = lx[par[j] = i] + ly[j] - w[i][j]) == 0) {
              marky[j] = 1;
              if (skojy[j] != -1) {
                q[qe++] = skojy[j];
              } else {
                v=j;
                goto koniec;
              }
            }
          }
        }
      }
      int x = -1;
      for (int i = 0; i < n; i++)
        if (!marky[i] && (x == -1 || slack[i] < x))
          x = slack[i];
      for (int i = 0; i < n; i++) {
        if (markx[i]) lx[i] -= x;
        if (marky[i]) ly[i] += x;
        else if ((slack[i] -= x) == 0) {
          marky[i] = 1;
          if (skojy[i] != -1) q[qe++] = skojy[i];
          else v = i;
        }
      }
    }
    koniec:
    while (v != -1) {
      int y = skojx[par[v]];
      skojx[par[v]] = v;
      skojy[v] = par[v];
      v = y;
    }
  }
  return vector<int>(skojx, skojx + n);
}
void solve() {
	scanf("%d", &days);
	REP(i, types) scanf("%d", c + i);
	REP(i, days) REP(j, types) scanf("%d", s[i] + j);
	vi a(days);
	REP(i, days) a[i] = rand() % types;
	int curr = score(a);
	pair <int, vi> best = {curr, a};
	auto inc = [&](const vi &v) {
		int s = score(v);
		maxi(best, make_pair(s, v));
	};
	const int M = 1e9;
	vector <ll> p;
	REP(i, types) p.push_back(M * sqrt(c[i] + 1));
	debug(imie(p));
	ll su = 0;
	for (ll x : p) su += x;
	auto pick = [&]() {
		ll c = rand() % su;
		REP(i, types) {
			c -= p[i];
			if (c < 0) return i;
		}
		assert(false);
	};
	UNTIL(1.9) {
		vi occs;
		REP(_, days) occs.push_back(pick());
		vector <vi> matr(days, vi(days));
		REP(i, days) REP(j, days) matr[i][j] = s[i][occs[j]];
		vi H = hungarian(matr, days);
		vi ans(days);
		REP(i, days) ans[i] = occs[H[i]];
		inc(ans);
		int s = score(ans);
		int stuck = 0;
		int loc_best = s;
		while (stuck < 1000) {
			int p = rand() % days;
			int v;
			do v = rand() % types; while (ans[p] == v);
			vi temp = ans;
			temp[p] = v;
			int s2 = score(temp);
			if (s2 > loc_best) {
				stuck = 0;
				loc_best = s2;
				inc(temp);
			}
			else
				stuck++;
			if (s2 >= s || rand() % 20 == 0) {
				ans = move(temp);
				s = s2;
			}
		}
	}
	for (int x : best.second) printf("%d\n", x + 1);
	cerr << "score = " << best.first << endl;
}
int main() {
	vector <vi> a = {{0, 1, 0}, {0, 0, 1}, {1, 0, 0}};
	debug(fun(hungarian, a, 3));
	unt seed = TIME; debug(imie(seed));srand(seed);
	int t = 1;
	// scanf("%d", &t);
	REP(_, t) solve();
	exit(0);
}
//#STAY AT HOME


Measured memory_bytes: 3960