#include <iostream>
#include <cstdio>
#include <cmath>
#include <cassert>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <cstring>

using namespace std;

const int MAXN = 400000;

int sa[MAXN]; //排第几的是哪个后缀  
//sa[i]的值为0---n-1 i的值为1---n
int rank[MAXN]; //rank后缀i排第几  
//rk[i]的值为1--n i的值为0--n-1
int height[MAXN]; //sa[i]和sa[i-1]的最长公共前缀  
//height[i]的值为公共前缀长度 i的值为1--n 表示第i大的后缀和第i-1大后缀的公共前缀长度
//按rank排序后两个后缀a和b的LCP即min(height[a+1]---height[b])
int st[MAXN][20];
//height数组的ST表;
int t1[MAXN],t2[MAXN],c[MAXN]; //临时数组空间

void build_sa(int s[],int n,int m) 
//s为要处理的字符串的转化形式,将所有字符转化成1---m的范围的int
//n为长度,s[n]必须为0,m为字符集大小
{  
    n++;
    int *x=t1,*y=t2;  
    //第一轮基数排序  
    for(int i=0;i<m;i++) c[i]=0;  
    for(int i=0;i<n;i++) c[x[i]=s[i]]++;  
    for(int i=1;i<m;i++) c[i]+=c[i-1];  
    for(int i=n-1;i>=0;i--) sa[--c[x[i]]]=i;  
    for(int j=1;j<=n;j<<=1)  
    {  
        int p=0;  
        //直接利用sa数组排序第二关键字  
        for(int i=n-j;i<n;i++) y[p++]=i;  
        for(int i=0;i<n;i++)  
            if(sa[i]>=j) y[p++]=sa[i]-j;  
        //基数排序第一关键字  
        for(int i=0;i<m;i++) c[i]=0;  
        for(int i=0;i<n;i++) c[x[y[i]]]++;  
        for(int i=1;i<m;i++) c[i]+=c[i-1];  
        for(int i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];  
        //根据sa和x数组计算新的x数组  
        swap(x,y);  
        p=1,x[sa[0]]=0;  
        for(int i=1;i<n;i++)  
            x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j]?p-1:p++;  
        if(p>=n) break;  
        m=p;  
    }  
}  

void getheight(int s[],int n)  
{  
    int k=0;  
    for(int i=0;i<=n;i++)  
        rank[sa[i]]=i;  
    for(int i=0;i<n;i++)  
    {  
        if(k) k--;  
        int j=sa[rank[i]-1];  
        while(s[i+k]==s[j+k]) k++;  
        height[rank[i]]=k;  
    }  
}  

void getRMQ(int n)
{
    for (int j = 1; j<=n; j++){
        st[j][0] = n-sa[j];
        if (j!=n) st[j][1] = height[j+1];
    }
    for (int i = 2; (1<<i)<=n; i++){
        for (int j = 1; j<=n-(1<<i)+1; j++){
            st[j][i] = min(min(st[j][i-1],st[j+(1<<(i-1))][i-1]),height[j+(1<<(i-1))]);
        }
    }
}

char s[MAXN];
int a[MAXN];
int n;
long long cnt[MAXN], sum[MAXN];

pair<int,int> getKth(int n, long long k)
//n传入字符串长度, k必须小于等于sum[n]
{
    int l,r;
    int res = lower_bound(sum+1,sum+n+1,k)-sum;
    int len = height[res]+(k-sum[res-1]);
    l = sa[res];
    r = l+len-1;
    return make_pair(l,r);
}

int lcp(int a, int b)
//a,b范围0--n-1 返回从a/b开始的后缀的lcp
{
    if (a==b) return n-a;
    int A = rank[a];
    int B = rank[b];
    if (A>B) swap(A,B);
    int k = 31-__builtin_clz(B-A+1);
    return min(st[A][k],st[B-(1<<k)+1][k]);
}

bool ok(char *s, pair<int,int> tmp, int parts)
{
    for (int i = 0; i<n; i++)
        if (s[i]>s[tmp.first]) return false;
    char test[MAXN] = {0};
    for (int i = tmp.first; i<=tmp.second; i++)
        test[i-tmp.first] = s[i];
    int len = tmp.second-tmp.first+1;
    int tail = n-1;
    int cnt = 1;
    for (int i = n-1; i>=0; i--){
        int coLen = lcp(i,tmp.first);
        if (coLen>len && tail-i+1>len){
            cnt++;
            tail = i;
        }
        else if(coLen==len && tail-i+1>len){
            cnt++;
            tail = i;
        }
        else if (coLen<len && tail-i+1>coLen && s[i+coLen]>test[coLen]){
            cnt++;
            tail = i;
        }
        if (cnt>parts) return false;
    }
    return true;
}

int main()
{
    int parts;
    while (scanf("%d", &parts)==1){
        if (parts==0) return 0;
        scanf("%s", s);
        //求第k大字串预备工作
        memset(cnt, 0, sizeof(cnt));
        memset(sum, 0, sizeof(sum));
        memset(sa, 0, sizeof(sa));
        memset(rank, 0, sizeof(rank));
        memset(height, 0, sizeof(height));
        memset(st, 0, sizeof(st));
        long long l, r;
        l = r = 0;
        n = strlen(s);
        for (int i = 0; i<n; i++) a[i] = s[i]-'a'+1;
        a[n] = 0; 
        build_sa(a,n,30);
        getheight(a,n);
        getRMQ(n);
        for (int i = 1; i<=n; i++){
            cnt[i] = n-sa[i]-height[i];
            sum[i] = sum[i-1]+cnt[i];
        }
        //预备工作结束
        pair<int,int> tmp, ans;
        long long left = 1, right = sum[n], mid;
        while (left<=right){
            mid = left+right;
            mid /= 2;
            tmp = getKth(n,mid);
            if (ok(s,tmp,parts)){
                right = mid-1;
                ans = tmp;
            }
            else left = mid+1;
        }
        for (int i = ans.first; i<=ans.second; i++) printf("%c", s[i]);
        printf("\n");
    }
}