#include <bits/stdc++.h>
using namespace std;
struct InputReader {
  char buf[1048576];
  int p;
  inline InputReader() { p = 1048576; }
  inline void Flush() {
    p = 0;
    fread(buf, 1, 1048576, stdin);
  }
  inline char C() {
    if (p >= 1048576) Flush();
    return buf[p++];
  }
  inline char Readnum() {
    char ch = C();
    while (!isdigit(ch) && ch != '-') ch = C();
    return ch;
  }
  inline void Readalpha(char &c) {
    c = C();
    while (!isalpha(c)) c = C();
  }
  int operator()() {
    int ans = 0, fu = 1;
    char ch = Readnum();
    if (ch == '-') fu = -1, ch = C();
    while (ch >= '0' && ch <= '9') {
      ans = ans * 10 + ch - '0';
      ch = C();
    }
    return ans * fu;
  }
  long long Readll() {
    long long ans = 0LL, fu = 1LL;
    char ch = Readnum();
    if (ch == '-') fu = -1LL, ch = C();
    while (ch >= '0' && ch <= '9') {
      ans = ans * 10LL + ch - '0';
      ch = C();
    }
    return ans * fu;
  }
  inline void Readstring(string &x) {
    x.clear();
    char ch = C();
    while (!isdigit(ch) && !isalpha(ch) && ch != '#' && ch != '.') ch = C();
    while (isdigit(ch) || isalpha(ch) || ch == '#' || ch == '.') {
      x += ch;
      ch = C();
    }
  }
  inline void Readchstring(char s[]) {
    int len = 0;
    char ch = C();
    while (!isdigit(ch) && !isalpha(ch)) ch = C();
    while (isdigit(ch) || isalpha(ch)) {
      s[len++] = ch;
      ch = C();
    }
    s[len] = '\0';
  }
  inline void Specialread(char &c) {
    c = C();
    while (!isdigit(c) && !isalpha(c) && c != '#' && c != '.' && c != '=' &&
           c != 'B')
      c = C();
  }
} In;
inline void Read(int &x) { x = In(); }
inline void Read(int &x, int &y) {
  x = In();
  y = In();
}
inline void Read(int &x1, int &x2, int &x3) {
  x1 = In();
  x2 = In();
  x3 = In();
}
inline void Read(int &x1, int &x2, int &x3, int &x4) {
  x1 = In();
  x2 = In();
  x3 = In();
  x4 = In();
}
inline void Read(long long &x) { x = In.Readll(); }
inline void Read(long long &x, long long &y) {
  x = In.Readll();
  y = In.Readll();
}
inline void Read(long long &x1, long long &x2, long long &x3) {
  x1 = In.Readll();
  x2 = In.Readll();
  x3 = In.Readll();
}
inline void Read(long long &x1, long long &x2, long long &x3, long long &x4) {
  x1 = In.Readll();
  x2 = In.Readll();
  x3 = In.Readll();
  x4 = In.Readll();
}
template <typename T>
void Read(T a[], int st, int ed) {
  for (int(i) = (st); (i) <= (ed); ++(i)) Read(a[i]);
}
inline void FILEIO() {}
inline void FILEIO(string pname) {
  freopen((pname + ".in").c_str(), "r", stdin);
  freopen((pname + ".out").c_str(), "w", stdout);
}
inline void FILEIO_OICONTEST(string pname) {
  freopen((pname + ".in").c_str(), "r", stdin);
  freopen((pname + ".out").c_str(), "w", stdout);
}
void Printtime() {}
void END() {
  Printtime();
  exit(0);
}
template <typename T>
void END(T mes) {
  cout << mes << endl;
  END();
}
template <typename T>
void Print(T a[], int s, int t, char sp = ' ', char ed = '\n') {
  if (s > t) return;
  for (int i = s; i < t; i++) cout << a[i] << sp;
  cout << a[t] << ed;
  cout.flush();
}
template <typename T>
void Print(T a, int s = 0, int t = -1, char sp = ' ', char ed = '\n') {
  if (t == -1) t = a.size() - 1;
  for (int i = s; i <= t; i++) cout << a[i] << sp;
  cout << ed;
  cout.flush();
}
vector<int> Range(int l, int r) {
  vector<int> ret{};
  for (int(i) = (l); (i) <= (r); ++(i)) ret.push_back(i);
  return ret;
}
mt19937 Rand(0xe38195e38293);
namespace io {
const int SIZE = (1 << 20) + 1;
char ibuf[SIZE], *iS, *iT, obuf[SIZE], *oS = obuf, *oT = oS + SIZE - 1, c,
                                       qu[55];
int f, qr;
inline void Flush() {
  fwrite(obuf, 1, oS - obuf, stdout);
  oS = obuf;
}
inline void Putc(char x) {
  *oS++ = x;
  if (oS == oT) Flush();
}
template <class I>
inline void Print(I x) {
  if (!x) {
    Putc('0');
    return;
  }
  while (x) {
    qu[++qr] = x % 10 + '0';
    x /= 10;
  }
  while (qr) Putc(qu[qr--]);
}
struct Flusher_ {
  ~Flusher_() { Flush(); }
} io_flusher_;
}  // namespace io
const int MAXN = 5010;
int n, k;
string s;
int main() {
  FILEIO();
  Read(n, k);
  In.Readstring(s);
  if (k == 1) {
    string rev = s;
    reverse(rev.begin(), rev.end());
    s = s + rev;
    string ans = "~~~";
    for (int(i) = 0; (i) < (n + 1); ++(i)) (ans) = min((ans), (s.substr(i, n)));
    cout << ans << endl;
    END();
  }
  char minc = *min_element(s.begin(), s.end());
  int mxlen;
  vector<int> eds;
  int tlen = 0;
  for (int(i) = 0; (i) < (n); ++(i)) {
    if (s[i] == minc) {
      ++tlen;
      if (tlen > mxlen) {
        eds.clear();
        mxlen = tlen;
      }
      if (tlen == mxlen) eds.emplace_back(i);
    } else {
      tlen = 0;
    }
  }
  if (k > 20 or (1 << k >> 1) * mxlen >= n) {
    string ans(n, minc);
    END(ans);
  }
  if (eds.back() == n - 1 and (1 << k) * mxlen >= n) {
    string ans(n, minc);
    END(ans);
  }
  string rs = s;
  reverse(rs.begin(), rs.end());
  string srs = s + rs;
  string ans = "~~~";
  auto GetAns = [&](int pos) -> string {
    int oppo = n + n - 1 - pos;
    int tmxlen = pos == n - 1 ? (1 << k) * mxlen : (1 << k >> 1) * mxlen;
    string ans(tmxlen, minc);
    while (srs[oppo] == minc) --oppo;
    while (ans.length() != n) {
      ans += srs[oppo];
      --oppo;
    }
    return ans;
  };
  for (auto p : eds) {
    string tans = GetAns(p);
    (ans) = min((ans), (tans));
  }
  cout << ans << endl;
  END();
}
