#include <bits/stdc++.h>
using namespace std;

// Loops
#define _overload3(_1, _2, _3, name, ...) name
#define _rep(i, n) repi(i, 0, n)
#define repi(i, a, b) for (int i = int(a); i < int(b); ++i)
#define _rrep(i, n) rrepi(i, n, 0)
#define rrepi(i, a, b) for (int i = int(a) - 1; i >= int(b); --i)

#define rep(...) _overload3(__VA_ARGS__, repi, _rep, )(__VA_ARGS__)
#define rrep(...) _overload3(__VA_ARGS__, rrepi, _rrep, )(__VA_ARGS__)
#define each(xi, x) for (auto &&xi : x)
// Note: we can use rep(i,N) or rep(i,from,to)

// typedef
template <class T> using vec = vector<T>;
using ll = long long;
using vi = vec<ll>;
using vvi = vec<vi>;
using vvvi = vec<vvi>;
using pii = pair<ll, ll>;

// Constants

// Shorter repr for frequently used terms
#define pb push_back
#define mp make_pair

// Algorithms
#define all(x) (x).begin(), (x).end()
#define uniq(v) v.erase(unique(all(v)), v.end())
#define perm(c)                                                                \
  sort(all(c));                                                                \
  for (bool c##p = 1; c##p; c##p = next_permutation(all(c)))

template <class T> pair<T, size_t> max(vector<T> &x) {
  auto it = max_element(all(x));
  return mp(*it, it - x.begin());
}
template <class T> pair<T, size_t> min(vector<T> &x) {
  auto it = min_element(all(x));
  return mp(*it, it - x.begin());
}

template <class T> inline bool chmax(T &maxval, const T &newval) {
  if (maxval < newval) {
    maxval = newval;
    return 1;
  }
  return 0;
}
template <class T> inline bool chmin(T &minval, const T &newval) {
  if (minval > newval) {
    minval = newval;
    return 1;
  }
  return 0;
}

// Utilities
// Grid world utilities
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
#define inside(H, W, y, x) 0 <= (x) && (x) < (W) && 0 <= (y) && (y) < (H)

// Debug
#ifdef LOCAL
#include "dump.hpp"
#define debug(x) cerr << #x << ": " << x << '\n'
#else
#define dump(...)
#define debug(x)
#endif

// Yes or No
void yesno(bool ok, string yes = "Yes", string no = "No") {
  cout << (ok ? yes : no) << endl;
}

// Paste snippets here!!
ll manzoku_naive(long long D, std::vector<long long> c,
                 std::vector<std::vector<long long>> s,
                 std::vector<long long> t)
{
  ll manzoku;
  vec<ll> last(26,0);
  rep(d,D){
    manzoku += s[d][t[d]-1];
    last[t[d]-1] = d+1;
    rep(i,26){
      manzoku -= c[i]*(d+1-last[i]);
    }
  }
  return manzoku;
}

ll choose_greedy(const vec<vec<ll>> &s, ll d){
  ll imax; ll M = numeric_limits<ll>::min();
  rep(i,26){
    if(s[d][i]>M){
      M = s[d][i]; imax = i;
    }
  }
  return imax+1;
}

void solve(long long D, std::vector<long long> c,
           std::vector<std::vector<long long>> s)
{
  auto start = chrono::steady_clock::now();
  std::random_device rnd;
  mt19937 mt(rnd());
  vec<ll> t(D);
  rep(d,D) t[d] = 1 + (mt()%26);
  ll obj = manzoku_naive(D, c, s, t);
  ll cnt = 0;
  while(chrono::duration<double>(chrono::steady_clock::now() - start).count()<1.95){
    int d = mt()%D; ll tt;
    if(cnt++ % 2 == 0){
      tt = choose_greedy(s,d);
    } else {
      tt = 1LL+(mt()%26);
    }
    
    if(t[d]!=tt){
      ll t_old = t[d];
      t[d] = tt;
      ll obj_new = manzoku_naive(D,c,s,t);
      if(obj_new<obj) t[d] = t_old;
      else { obj = obj_new; }
    }
  }
  rep(d,D) cout << t[d] << endl;
}

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false); // Magic for faster cin
  cout.precision(12);
  long long D;
  std::cin >> D;
  std::vector<long long> c(26);
  for (int i = 0; i < 26; i++) {
    std::cin >> c[i];
  }
  std::vector<std::vector<long long>> s(D, std::vector<long long>(26));
  for (int i = 0; i < D; i++) {
    for (int j = 0; j < 26; j++) {
      std::cin >> s[i][j];
    }
  }
  solve(D, std::move(c), std::move(s));
  return 0;
}


Measured memory_bytes: 3812