#pragma region template
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vi>;
using vvvi = vector<vvi>;
using vll = vector<ll>;
using vvll = vector<vll>;
using vvvll = vector<vvll>;
using vld = vector<ld>;
using vvld = vector<vld>;
using vvvld = vector<vvld>;
using vs = vector<string>;
using pll = pair<ll, ll>;
using vp = vector<pll>;
template <typename T>
using pqrev = priority_queue<T, vector<T>, greater<T>>;
#define rep(i, n) for (int i = 0, i##_end = (n); i < i##_end; i++)
#define repb(i, n) for (int i = (n)-1; i >= 0; i--)
#define repr(i, a, b) for (int i = (a), i##_end = (b); i < i##_end; i++)
#define reprb(i, a, b) for (int i = (b)-1, i##_end = (a); i >= i##_end; i--)
#define ALL(a) (a).begin(), (a).end()
#define SZ(x) ((int)(x).size())
//
constexpr ll MOD = 1e9 + 7;
/*/
constexpr ll MOD = 998244353;
//*/
constexpr ll INF = 1e+18;
constexpr ld EPS = 1e-12L;
constexpr ld PI = 3.14159265358979323846L;
constexpr ll GCD(ll a, ll b) { return b ? GCD(b, a % b) : a; }
constexpr ll LCM(ll a, ll b) { return a / GCD(a, b) * b; }
template <typename S, typename T>
inline bool chmax(S &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <typename S, typename T>
inline bool chmin(S &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
#ifdef OJ_LOCAL
#include "dump.hpp"
#else
#define dump(...) ((void)0)
#endif
template <typename T>
bool print_(const T &a) {
  cout << a;
  return true;
}
template <typename T>
bool print_(const vector<T> &vec) {
  for (auto &a : vec) {
    cout << a;
    if (&a != &vec.back()) {
      cout << " ";
    }
  }
  return false;
}
template <typename T>
bool print_(const vector<vector<T>> &vv) {
  for (auto &v : vv) {
    for (auto &a : v) {
      cout << a;
      if (&a != &v.back()) {
        cout << " ";
      }
    }
    if (&v != &vv.back()) {
      cout << "\n";
    }
  }
  return false;
}
void print() { cout << "\n"; }
template <typename Head, typename... Tail>
void print(Head &&head, Tail &&... tail) {
  bool f = print_(head);
  if (sizeof...(tail) != 0) {
    cout << (f ? " " : "\n");
  }
  print(forward<Tail>(tail)...);
}

// https://github.com/beet-aizu/library/blob/master/marathon/timer.cpp
constexpr ll CPS = 2800000000;
struct Timer {
  ll start;
  Timer() { reset(); }
  void reset() { start = getCycle(); }
  inline double get() { return (double)(getCycle() - start) / CPS; }
  inline ll getCycle() {
    uint32_t low, high;
    __asm__ volatile("rdtsc"
                     : "=a"(low), "=d"(high));
    return ((ll)low) | ((ll)high << 32);
  }
};
Timer timer;

// result:
// AtCoder_codetest: CPS = 2800000000 cnt = 285970395(2980 ms)
// My_PC           : CPS = 3500000000 cnt = 310452127(2980 ms)

random_device rnd_dev;
mt19937_64 mt(rnd_dev());

// 一様乱数[a, b]の生成 2倍遅い
ll rnd(ll a, ll b){
  uniform_int_distribution<ll> r(a, b);
  return r(mt);
}

// 一様乱数[a, b)の生成 n倍遅い
ld rnd(ld a, ld b){
  uniform_real_distribution<ld> r(a, b);
  return r(mt);
}

#pragma endregion


const int D_MAX = 365;
const int M_MAX = 100000;
const int CONT_MAX = 26;
int D;
int c[CONT_MAX];
int s[D_MAX][CONT_MAX];

int t[D_MAX];

int last[D_MAX][CONT_MAX];

// 変えたときの得点計算
int query(int d, int q){
  int ans_delta = 0;
  // plus
  ans_delta -= s[d][t[d]];
  ans_delta += s[d][q];
  // minus
  int kp = 1, kn = 1;
  repb(j, d){
    if(t[j] == t[d]){
      break;
    }
    kp++;
  }
  repr(j, d+1, D){
    if(t[j] == t[d]){
      break;
    }
    kn++;
  }
  ans_delta -= kp*kn*c[t[d]];
  kp = 1, kn = 1;
  repb(j, d){
    if(t[j] == q){
      break;
    }
    kp++;
  }
  repr(j, d+1, D){
    if(t[j] == q){
      break;
    }
    kn++;
  }
  ans_delta += kp*kn*c[q];
  return ans_delta;
}
int query_swap(int d){
  if(t[d] == t[d+1]){
    return 0;
  }
  int ans_delta = 0;
  // plus
  ans_delta -= s[d][t[d]];
  ans_delta += s[d][t[d+1]];
  ans_delta -= s[d+1][t[d+1]];
  ans_delta += s[d+1][t[d]];
  // minus
  int kp = 1, kn = 1;
  repb(j, d){
    if(t[j] == t[d]){
      break;
    }
    kp++;
  }
  repr(j, d+1, D){
    if(t[j] == t[d]){
      break;
    }
    kn++;
  }
  ans_delta -= kp*kn*c[t[d]];
  ans_delta += (kp+1)*(kn-1)*c[t[d]];
  kp = 1, kn = 1;
  repb(j, d+1){
    if(t[j] == t[d+1]){
      break;
    }
    kp++;
  }
  repr(j, d+1+1, D){
    if(t[j] == t[d+1]){
      break;
    }
    kn++;
  }
  ans_delta -= kp*kn*c[t[d+1]];
  ans_delta += (kp-1)*(kn+1)*c[t[d+1]];
  
  return ans_delta;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  
  cin >> D;
  rep(i, CONT_MAX){
    cin >> c[i];
  }
  rep(i, D)rep(j, CONT_MAX){
    cin >> s[i][j];
  }
  
  // 初期解 1, 2, ..., 26, 1, ...
  rep(i, D){
    t[i] = i % 26;
  }
  
  rep(i, D)rep(j, CONT_MAX){
    if(j == t[i]){
      last[i][j] = i;
    }else if(i > 0){
      last[i][j] = last[i-1][j];
    }else{
      last[i][j] = -1;
    }
  }
  
  int ans = 0;
  rep(i, D){
    // plus
    ans += s[i][t[i]];
    // minus
    rep(j, CONT_MAX){
      ans -= c[j]*(i-last[i][j]);
    }
  }
  
  uniform_int_distribution<int> rnd_day(0, D-2);
  uniform_int_distribution<int> rnd_cont(0, CONT_MAX-1);
  uniform_int_distribution<int> rnd_choice(0, 99);
  int da;
  while (timer.get() <= 2.05) {
    if(rnd_choice(mt) < 60){
      // 隣とのスワップ
      int d = rnd_day(mt);
      da = query_swap(d);
      if(da >= 0){
        ans += da;
        swap(t[d], t[d+1]);
      }
    }else{
      int d = rnd_day(mt);
      int q = rnd_cont(mt);
      da = query(d, q);
      if(da >= 0){
        t[d] = q;
        ans += da;
      }
    }
  }
  rep(i, D)rep(j, CONT_MAX){
    if(j == t[i]){
      last[i][j] = i;
    }else if(i > 0){
      last[i][j] = last[i-1][j];
    }else{
      last[i][j] = -1;
    }
  }
  int ans_last = 0;
  rep(i, D){
    // plus
    ans_last += s[i][t[i]];
    // minus
    rep(j, CONT_MAX){
      ans_last -= c[j]*(i-last[i][j]);
    }
  }
  assert(ans_last == ans);
  rep(i, D){
    print(t[i]+1);
  }
}

Measured memory_bytes: 3736