#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops")
using namespace std;
template <typename T>
constexpr int infValue =
    std::is_same<T, int>::value ? 2000100007 : 8600000000000000007ll;
template <typename T>
constexpr int maxValue =
    std::is_same<T, int>::value ? 1000000007 : 1000000000000000001ll;
const int INF = infValue<int>;
const long long MOD = 1000000007ll;
const double EPS = 1e-6;
const int MAX = maxValue<int>;
int n, m, cnt;
char s[100101];
vector<int> p[26];
int dp[2][100101];
bool f(int i) {
  bool ok = true;
  int l = -1;
  for (register int j = 0; j < n; ++j) {
    if (s[j] <= 'a' + i) l = j;
    ok = ok && (j - l + 1 <= m);
  }
  return ok;
}
int bs() {
  int l = -1, r = 25;
  while (r - l > 1) {
    int md = l + r >> 1;
    if (f(md))
      r = md;
    else
      l = md;
  }
  return r;
}
multiset<int> bv;
int main(void) {
  scanf("%d", &m);
  scanf("%s", s);
  while (s[n]) p[s[n] - 'a'].push_back(n), ++n;
  if (m > 1) {
    f(0);
    int k = bs();
    for (register int j = 0; j < k; ++j) {
      int cnt = p[j].size();
      while (cnt--) putc('a' + j, stdout);
    }
    dp[0][0] = 0;
    if (s[0] < 'a' + k) {
      dp[1][0] = 0;
    } else if (s[0] == 'a' + k) {
      dp[1][0] = 1;
    } else {
      dp[1][0] = INF;
    }
    bv.insert(dp[1][0]);
    for (register int i = 1; i < n; ++i) {
      int j = max(i - m + 1, 0), mm = *bv.begin();
      int mmm = i - m < 0 ? 0 : min(mm, dp[1][i - m]);
      if (s[i] < 'a' + k) {
        dp[0][i] = dp[1][i] = mmm;
      } else if (s[i] == 'a' + k) {
        dp[0][i] = mmm;
        dp[1][i] = mmm + 1;
      } else {
        dp[0][i] = mm;
        dp[1][i] = INF;
      }
      if (i - m + 1 >= 0) bv.erase(bv.lower_bound(dp[1][i - m + 1]));
      bv.insert(dp[1][i]);
    }
    cnt = dp[0][n - 1];
    while (cnt--) putc('a' + k, stdout);
    putc('\n', stdout);
  } else {
    sort(s, s + n);
    puts(s);
  }
  return 0;
}
