#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   ff2(i,a,b+1)
   {
    if(n%i == 0 && n/i == k)
    {
      ll p =  n/i;
      for(ll j = 0;j+i<n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      rr;
    }
    ll p = n/i;
    ll rm = n%i;
    if(p<k && rm >= a)
    {
      ll j = 0;
      for(j = 0;j+i<n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      ll q = n%i;
      string ss = s.substr(j,q);
      cout<<ss;rr;
    }
   }
   cout<<"No solution";
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   // ff1(i,a,b+1)
   // {
   //  if(n%i == 0 && n/i == k)
   //  {
   //    ll p =  n/i;
   //    for(ll j = 0;j+i<=n;j+=i)
   //    {
   //       string ss = s.substr(j,i);
   //       cout<<ss<<kl;
   //    }
   //    rr;
   //  }
   //  ll p = n/i;
   //  ll rm = n%i;
   //  if(p<k && rm >= a)
   //  {
   //    ll j = 0;
   //    for(j = 0;j+i<=n;j+=i)
   //    {
   //       string ss = s.substr(j,i);
   //       cout<<ss<<kl;
   //    }
   //    ll q = n%i;
   //    string ss = s.substr(j,q);
   //    cout<<ss;rr;
   //  }
   // }
    ff2(i,a,b+1)
   {
    ll p = n/i;
    ff1(j,1,p+1)
    {
      ll m = n;
      m-=j*i;
      ff1(x,i,b+1)
      {
        if(m%x == 0 && m/x == k-j)
        {
          ll q = 0;
          while(j--)
          {
            string ss = s.substr(q,i);
            cout<<ss<<kl;
            q+=i;
          }
           ll y = m/x;
           while(y--)
           {
            string ss = s.substr(q,x);
            cout<<ss<<kl;
            q+=x;
           }rr;
        }

      }
    }
   }
   cout<<"No solution";
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   ff1(i,a,b+1)
   {
    if(n%i == 0 && n/i == k)
    {
      ll p =  n/i;
      for(ll j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      rr;
    }
    ll p = n/i;
    ll rm = n%i;
    if(p<k && rm >= a)
    {
      ll j = 0;
      for(j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      ll q = n%i;
      string ss = s.substr(j,q);
      cout<<ss;rr;
    }
   }
   cout<<"No solution";
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   ff2(i,a,b+1)
   {
    if(n%i == 0)
    {
      ll p =  n/i;
      for(ll j = 0;j<n;j+=p)
      {
         string ss = s.substr(j,p);
         cout<<ss<<kl;
      }
      rr;
    }
    ll p = n/i;
    if(p<k)
    {
      for(ll j = 0;j+p<n;j+=p)
      {
         string ss = s.substr(j,p);
         cout<<ss<<kl;
      }
      ll q = n%i;
      string ss = s.substr(j,q);
      cout<<ss;rr;
    }
   }
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   // ff1(i,a,b+1)
   // {
   //  if(n%i == 0 && n/i == k)
   //  {
   //    ll p =  n/i;
   //    for(ll j = 0;j+i<=n;j+=i)
   //    {
   //       string ss = s.substr(j,i);
   //       cout<<ss<<kl;
   //    }
   //    rr;
   //  }
   //  ll p = n/i;
   //  ll rm = n%i;
   //  if(p<k && rm >= a)
   //  {
   //    ll j = 0;
   //    for(j = 0;j+i<=n;j+=i)
   //    {
   //       string ss = s.substr(j,i);
   //       cout<<ss<<kl;
   //    }
   //    ll q = n%i;
   //    string ss = s.substr(j,q);
   //    cout<<ss;rr;
   //  }
   // }
    ff2(i,a,b+1)
   {
    ll p = n/i;
    ff1(j,1,p+1)
    {
      ll m = n;
      m-=j*i;
      ff1(x,i+1,b+1)
      {
        if(m%x == 0 && m/x == k-j)
        {
          ll q = 0;
          while(j--)
          {
            string ss = s.substr(q,i);
            cout<<ss<<kl;
            q+=i;
          }
           ll y = m/x;
           while(y--)
           {
            string ss = s.substr(q,x);
            cout<<ss<<kl;
            q+=x;
           }rr;
        }

      }
    }
   }
   cout<<"No solution";
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   ff2(i,a,b+1)
   {
    if(n%i == 0 && n/i == k)
    {
      ll p =  n/i;
      for(ll j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      rr;
    }
    ll p = n/i;
    ll rm = n%i;
    if(p<k && rm >= a)
    {
      ll j = 0;
      for(j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      ll q = n%i;
      string ss = s.substr(j,q);
      cout<<ss;rr;
    }
   }
   cout<<"No solution";
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
//#include <boost/multiprecision/cpp_int.hpp>
//
//using namespace boost::multiprecision;
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

/*** Typedef ***/
typedef   long long ll;
typedef long long int lli;
typedef unsigned long long ull;
typedef   long double   ld;

//typedef    unordered_set<ll>   usll;
//typedef    unordered_multiset<ll>   umsll;

/*** Loops ***/
#define ffit(i, dat)    for (__typeof(dat.begin()) i = dat.begin(); i != dat.end(); ++i)
#define yo(a,b) for(int i = a; i < b; i++)
#define ff1(i,a,b) for(ll i = a; i < b; i++)
#define ff2(i,a,b) for(ll i = b-1; i >= a; i--)
#define ff3(i,a,b,m) for(ll i = a; i <b; i+=m)
#define ipar(ar,n) ll ar[n]; ff1(i,0,n) cin>>ar[i];
#define opar(ar,n) ff1(i,0,n) cout<<ar[i]<<" ";
#define foRev(num) for(ll i = num - 1; i >= 0; i--)
#define forIn(arr, num) for(ll i = 0; i < num; i++) sc1(arr[i]);
#define forIn1(arr, num) for(ll i = 1; i <= num; i++) sc1(arr[i]);
#define vpnt(ans) for(ll i = 0; i < ans.size(); i++) cout << ans[i] << (i + 1 < ans.size() ? ' ' : '\n');
#define apnt(arr, num) for(ll i = 0; i < num; i++) cout << arr[i] << (i + 1 < num ? ' ' : '\n');

/*** Define Values ***/

#define PI acos(-1.0)
#define eps 1e-7
#define size1 15
const ll mdd = (ll)1e9 + 7;
/*** STLs ***/
#define sf(a)            scanf("%lld",&a)
#define sff(a,b)         scanf("%lld %lld",&a,&b)
#define sfff(a,b,c)      scanf("%lld %lld %lld",&a,&b,&c)
#define cu continue
#define br break
#define rsz resize
#define ins insert
#define ft front
#define bk back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define ff first
#define ss second
#define mp make_pair
#define rr return
#define nxt   next_permutation
#define mem(name, value) memset(name, value, sizeof(name))
#define MN3(n1,n2,n3) min(n1,min(n2,n3))
#define MN4(n1,n2,n3,n4) min(n1,min(n2,min(n3,n4)))
#define MX3(n1,n2,n3) max(n1,max(n2,n3))
#define MX4(n1,n2,n3,n4) max(n1,max(n2,max(n3,n4)))
#define mxar(a,n) *max_element(a,a+n)
#define mnar(a,n) *min_element(a,a+n)
#define arr_sm(a,n) accumulate(a,a+n,0)
#define vc_sm(ve) accumulate(ve.begin(),ve.end(),0)
#define mx_vc(ve) *max_element(ve.begin(),ve.end())
#define mn_vc(ve) *min_element(ve.begin(),ve.end())
//#define endl " \n"

/*** STLs ***/
typedef vector <ll> vll;
#define vvll vector<vll>
typedef set <ll> sll;
typedef multiset <ll> msll;
typedef multimap <ll,ll> mpll;
typedef queue <ll> qll;
typedef map <ll, ll> mll;
typedef pair <ll, ll> pll;
typedef vector <pair <ll, ll> > vpll;
typedef priority_queue <pair <ll, ll> > pqpll;
#define uniq(v)           (v).erase(unique(all(v)),(v).end())
#define maxpq priority_queue<ll>
#define minpq priority_queue<ll, vector<ll>, greater<ll> >
#define ml unordered_map<ll,ll>
///typedef    unordered_multiset<int>   umsi;
typedef    unordered_set<ll>   us;

///vector<vector<int>> v(10, vector<int>(20,500)); 2d vector initialization. of 10 rows and 20 columns, with value 500.

/*** Sorts ***/
#define czero(n)                    __builtin_popcountll(n) // count the number of 1's in the bit representation of a number
#define cenzero(n)                  __builtin_ctzll(n) // count the number of zereos from the end of the bit representation of a number until a 1
#define countbegzero(n)             __builtin_clzxll(n)
#define checkparity(n)              __builtin_parityll(n)// checks whether the number of bits are even or odd
#define all(v) (v).begin(), (v).end()
#define rev(v) reverse(all(v))
#define srt(v) sort(all(v))
#define srtgrt(v) sort(all(v), greater<ll>())
#define prsrt greater<pair<int,int>>()
/*** Some Prints ***/
#define ip(n) ll n; cin>>n;
#define is(s) string s; cin>>s;
#define ipp(n,k) ll n; cin>>n; ll k; cin>>k;
#define ip3(n,m,k) ll n; cin>>n;ll m;cin>>m; ll k; cin>>k;
#define kl    '\n'
#define case cout << "Case " << t++ << ": ";
#define ps(x,y)         fixed<<setprecision(y)<<x
#define inf             1e18
#define w(x)             ll x; cin>>x; while(x--)
#define go(i, a) for (auto &i : a)
#define go1(it, v) for(auto it = v.rbegin(); it != v.rend(); ++it)
//#define mk(arr,n,type) type *arr=new type[n];
#define sz(obj) (int(obj.size()))
#define ipve(vc,n) vll vc(n); ff1(i,0,n){cin>>vc[i];}
#define ipvc(vc,n) vll vc; ff1(i,0,n){ip(x);vc.pb(x);}
#define cer cerr << "Time : " << 1000 * ((double)clock()) / (double)CLOCKS_PER_SEC << "ms\n";
#define depressed()                    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
//bool ans = all_of(arr, arr + 6, [](int x) {return x & 1; } );
const double pi = 3.141592653589793238460;
#define TRC
#ifdef TRC
#define trc(...) __f(#__VA_ARGS__, __VA_ARGS__)
    template <typename Arg1>
    void __f(const char* name, Arg1&& arg1){
        cout << name << " : " << arg1 << endl;
        //use cerr if u want to display at the bottom
    }
    template <typename Arg1, typename... Args>
    void __f(const char* names, Arg1&& arg1, Args&&... args){
        const char* comma = strchr(names + 1, ','); cout.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
    }
#else
#define trc(...)
#endif
#define no cout << "NO" << '\n'
#define yes cout << "YES" << '\n'
ll dx[8]={+1, +1, +1, 0, 0, -1, -1, -1};
ll dy[8] = {-1, 0, +1, -1, +1, -1, 0, +1};

void fun()
{
   ip3(k,a,b);
   is(s);
   ll n = sz(s);
   ff1(i,a,b+1)
   {
    if(n%i == 0 && n/i == k)
    {
      ll p =  n/i;
      for(ll j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      rr;
    }
    ll p = n/i;
    ll rm = n%i;
    if(p<k && rm >= a)
    {
      ll j = 0;
      for(j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      ll q = n%i;
      string ss = s.substr(j,q);
      cout<<ss;rr;
    }
   }
    ff2(i,a,b+1)
   {
    if(n%i == 0 && n/i == k)
    {
      ll p =  n/i;
      for(ll j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      rr;
    }
    ll p = n/i;
    ll rm = n%i;
    if(p<k && rm >= a)
    {
      ll j = 0;
      for(j = 0;j+i<=n;j+=i)
      {
         string ss = s.substr(j,i);
         cout<<ss<<kl;
      }
      ll q = n%i;
      string ss = s.substr(j,q);
      cout<<ss;rr;
    }
   }
   cout<<"No solution";
}

int main()
{
// tasklist
// taskkill /f /im mo.exe

    depressed();
  ll tc = 1;
  // seive(1e6);
 //cin>>tc;
  while(tc--)
  {
     fun();
  }
  //cer;
  return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define M 1000000007;
#define mp make_pair
#define pb push_back
#define pp pop_back
vector<int> V;
int  dp[201][201][201];
bool myfun(int n,int k,int a,int b,vector<int> v)
{
    //cout<<n<<":"<<k<<":"<<a<<":"<<b<<endl;
    if(k==0){
        if(n==0){
           // cout<<"hai";
           V.clear();
           V.pb(0);
           for(int i=0;i<v.size();i++){
                V.pb(v[i]);
           }
            return true;
        }
        else{
            return false;
        }
    }
     if(a>b){
        return false;
    }
    if(dp[n][b-a][k]!=-1){
        return dp[n][b-a][k];
    }
    v.pb(a);
    bool A=myfun(n-a,k-1,a+1,b,v);
    v.pp();
    bool B=myfun(n,k,a+1,b,v);
    dp[n][b-a][k]=A||B;
    return A||B;
}

int main()
{
    int k,a,b;
    cin>>k>>a>>b;
    string s;
    cin>>s;
    int n=s.length();
    for(int i=0;i<=200;i++){
        for(int j=0;j<=200;j++){
            for(int k=0;k<=200;k++){
                dp[i][j][k]=-1;
            }
        }
    }
    vector<int> v;
    bool ans=myfun(n,k,a,b,v);
    int w=1;
    if(ans){
        for(int i=0;i<n;i++){
            cout<<s[i];
            if(i+1-V[w-1]==V[w]){
                cout<<endl;
                V[w]+=V[w-1];
                w++;
            }
        }
    }
    else{
        cout<<"No solution"<<endl;
    }
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef vector<ll> VI;
typedef vector<pair<ll,ll> > VII;
//
#define M 1000000007;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define GO ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)

int main()
{
	GO;
	#ifndef ONLINE_JUDGE
    	// for getting input from input.txt
    	freopen("input.txt", "r", stdin);
    	// for writing output to output.txt
    	freopen("output.txt", "w", stdout);
	//for writing error to error.txt
    	freopen("error.txt","w",stderr);
	#endif

    ll k,a,b;
    cin>>k>>b>>a;
    string s;
    cin>>s;
    ll n=s.length();
    ll r=float((double)n/k);
    ll l=ceil((double)n/k);
    cerr<<r<<" "<<l<<endl;
    if(l>a||r<b){
    	cout<<"No solution"<<endl;
    	return 0;
    }
    else{
    	VI v;
    	ll n1=n;
    	while(n!=0){
    		if(k==1){
    			v.pb(n);
    		}
    		k--;
    		n-=l;
    		v.pb(l);
    		cerr<<v.back()<<" ";
    		l=ceil((double)n/k);
    	}
    	for(ll i=1;i<v.size();i++){
    		v[i]+=v[i-1];
    	}
    	ll w=0;
    	for(ll i=0;i<n1;i++){
    		if(v[w]==i){
    			cout<<endl;
    			w++;
    		}
    		cout<<s[i];
    	}
    }
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define M 1000000007;
#define mp make_pair
#define pb push_back
#define pp pop_back
vector<int> V;
int  dp[201][201][201];
bool myfun(int n,int k,int a,int b,vector<int> v)
{
    //cout<<n<<":"<<k<<":"<<a<<":"<<b<<endl;
    if(k==0){
        if(n==0){
           //cout<<"hai";
           V.clear();
           V.pb(0);
           for(int i=0;i<v.size();i++){
                V.pb(v[i]);
           }
            return true;
        }
        else{
            return false;
        }
    }
     if(a>b){
        return false;
    }
    if(dp[n][b-a][k]!=-1){
        return dp[n][b-a][k];
    }
    v.pb(a);
    bool A=myfun(n-a,k-1,a,b,v);
    v.pp();
    bool B=myfun(n,k,a+1,b,v);
    dp[n][b-a][k]=A||B;
    return A||B;
}

int main()
{
    int k,a,b;
    cin>>k>>a>>b;
    string s;
    cin>>s;
    int n=s.length();
    for(int i=0;i<=200;i++){
        for(int j=0;j<=200;j++){
            for(int k=0;k<=200;k++){
                dp[i][j][k]=-1;
            }
        }
    }
    vector<int> v;
    bool ans=myfun(n,k,a,b,v);
    int w=1;
    if(ans){
        for(int i=0;i<n;i++){
            cout<<s[i];
            if(i+1-V[w-1]==V[w]){
                cout<<endl;
                V[w]+=V[w-1];
                w++;
            }
        }
    }
    else{
        cout<<"No solution"<<endl;
    }
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define M 1000000007;
#define mp make_pair
#define pb push_back
#define pp pop_back
vector<int> V;
int  dp[301][301][301];
bool myfun(int n,int k,int a,int b,vector<int> v)
{
  //  cout<<n<<":"<<k<<":"<<a<<":"<<b<<endl;
    if(k==0){
        if(n==0){
           //cout<<"hai";
           V.clear();
           V.pb(0);
           for(int i=0;i<v.size();i++){
                V.pb(v[i]);
           }
            return true;
        }
        else{
            return false;
        }
    }
    if(n<0||k<0){
        return 0;
    }
     if(a>b){
        return false;
    }
    if(dp[n][b-a][k]!=-1){
        return dp[n][b-a][k];
    }
    v.pb(a);
    bool A=myfun(n-a,k-1,a,b,v);
    v.pp();
    bool B=myfun(n,k,a+1,b,v);
    dp[n][b-a][k]=A||B;
    return A||B;
}

int main()
{
    int k,a,b;
    cin>>k>>a>>b;
    string s;
    cin>>s;
    int n=s.length();
    for(int i=0;i<=300;i++){
        for(int j=0;j<=300;j++){
            for(int k=0;k<=300;k++){
                dp[i][j][k]=-1;
            }
        }
    }
    vector<int> v;
    bool ans=myfun(n,k,a,b,v);
    int w=1;
    if(ans){
        for(int i=0;i<n;i++){
            cout<<s[i];
            if(i+1-V[w-1]==V[w]){
                cout<<endl;
                V[w]+=V[w-1];
                w++;
            }
        }
    }
    else{
        cout<<"No solution"<<endl;
    }
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
#define M 1000000007;
#define mp make_pair
#define pb push_back
#define pp pop_back
vector<int> V;
int  dp[301][301][301];
bool myfun(int n,int k,int a,int b,vector<int> v)
{
    //cout<<n<<":"<<k<<":"<<a<<":"<<b<<endl;
    if(k==0){
        if(n==0){
           //cout<<"hai";
           V.clear();
           V.pb(0);
           for(int i=0;i<v.size();i++){
                V.pb(v[i]);
           }
            return true;
        }
        else{
            return false;
        }
    }
     if(a>b){
        return false;
    }
    if(dp[n][b-a][k]!=-1){
        return dp[n][b-a][k];
    }
    v.pb(a);
    bool A=myfun(n-a,k-1,a,b,v);
    v.pp();
    bool B=myfun(n,k,a+1,b,v);
    dp[n][b-a][k]=A||B;
    return A||B;
}

int main()
{
    int k,a,b;
    cin>>k>>a>>b;
    string s;
    cin>>s;
    int n=s.length();
    for(int i=0;i<=300;i++){
        for(int j=0;j<=300;j++){
            for(int k=0;k<=300;k++){
                dp[i][j][k]=-1;
            }
        }
    }
    vector<int> v;
    bool ans=myfun(n,k,a,b,v);
    int w=1;
    if(ans){
        for(int i=0;i<n;i++){
            cout<<s[i];
            if(i+1-V[w-1]==V[w]){
                cout<<endl;
                V[w]+=V[w-1];
                w++;
            }
        }
    }
    else{
        cout<<"No solution"<<endl;
    }
	return 0;
}


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

string s;
long long k,a,b,n,c,d,e,f;
unsigned long long m;
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>k>>a>>b>>s;
	n=s.length();
	c=b-1-a-1;
	m=n;
	a++;
	if(a*k>n||b*k<n)
	{
		cout<<"No solution"<<endl;
		return 0;
	}
	else
	{
		m-=a*k;
		if(m)
		{
			d=m/c;
			e=m%c;
			if(e)
			{
				f=k-1-d;
			}
			else
			{
				f=k-d;
			}
			//cout<<d<<" "<<e<<endl;
		}
		else
		{
			f=k;
		}
		//cout<<f<<endl;
		for(int i=0;i<n;i++)
		{
			if(f)
			{
				cout<<s.substr(i,a)<<endl;;
				f--;
				i+=a-1;
			}
			else
			{
				if(e)
				{
					cout<<s.substr(i,a+e)<<endl;
					e=0;
					i+=a+e-1;
				}
				else
				{
					if(d)
					{
						cout<<s.substr(i,b)<<endl;
						d--;
						i+=b-1;
					}
				}
			}
		}
	}
	return 0;
}


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

string s;
long long k,a,b,n,c,d,e,f;
unsigned long long m;
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>k>>a>>b>>s;
	n=s.length();
	c=b-a;
	m=n;
	if(a*k>n||b*k<n)
	{
		cout<<"No solution"<<endl;
		return 0;
	}
	else
	{
		m-=a*k;
		if(m)
		{
			d=m/c;
			e=m%c;
			if(e)
			{
				f=k-1-d;
			}
			else
			{
				f=k-d;
			}
			//cout<<d<<" "<<e<<endl;
		}
		else
		{
			f=k;
		}
		//cout<<f<<endl;
		for(int i=0;i<n;i++)
		{
			if(f)
			{
				cout<<s.substr(i,a)<<endl;;
				f--;
				i+=a-1;
			}
			else
			{
				if(e)
				{
					cout<<s.substr(i,a+e)<<endl;
					e=0;
					i+=a+e-1;
				}
				else
				{
					if(d)
					{
						cout<<s.substr(i,b)<<endl;
						d--;
						i+=b-1;
					}
				}
			}
		}
	}
	return 0;
}


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

string s;
long long k,a,b,n,c,d,e,f;
unsigned long long m;
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>k>>a>>b>>s;
	n=s.length();
	c=b-a;
	m=n;
	if(a*k>n||b*k<n)
	{
		cout<<"No solution"<<endl;
		return 0;
	}
	else
	{
		m-=a*k;
		if(m)
		{
			d=m/c;
			e=m%c;
			if(e)
			{
				f=k-1-d;
			}
			else
			{
				f=k-d;
			}
			//cout<<d<<" "<<e<<endl;
		}
		else
		{
			f=k;
		}
		//cout<<f<<endl;
		for(int i=0;i<n;i++)
		{
			if(f)
			{
				cout<<s.substr(i,a)<<endl;;
				f--;
				i+=a-1;
			}
			else
			{
				if(e)
				{
					cout<<s.substr(i,a+e)<<endl;
					i+=a+e-1;
					e=0;
				}
				else
				{
					if(d)
					{
						cout<<s.substr(i,b)<<endl;
						d--;
						i+=b-1;
					}
				}
			}
		}
	}
	return 0;
}


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

string s;
long long k,a,b,n,c,d,e,f;
unsigned long long m;
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin>>k>>a>>b>>s;
	n=s.length();
	c=b-1-a-1;
	m=n;
	a++;
	b--;
	if(a*k>n||b*k<n)
	{
		cout<<"No solution"<<endl;
		return 0;
	}
	else
	{
		m-=a*k;
		if(m)
		{
			d=m/c;
			e=m%c;
			if(e)
			{
				f=k-1-d;
			}
			else
			{
				f=k-d;
			}
			//cout<<d<<" "<<e<<endl;
		}
		else
		{
			f=k;
		}
		//cout<<f<<endl;
		for(int i=0;i<n;i++)
		{
			if(f)
			{
				cout<<s.substr(i,a)<<endl;;
				f--;
				i+=a-1;
			}
			else
			{
				if(e)
				{
					cout<<s.substr(i,a+e)<<endl;
					e=0;
					i+=a+e-1;
				}
				else
				{
					if(d)
					{
						cout<<s.substr(i,b)<<endl;
						d--;
						i+=b-1;
					}
				}
			}
		}
	}
	return 0;
}


#pragma warning(disable : 4996)
#include <iostream>
#include <string>
#include <list>
using namespace std;
int k, a, b;
string str;
list<char> vec;
int main(void)
{
	scanf("%d %d %d", &k, &a, &b);
	cin >> str;
	int n = str.length();
	for (int i = 0; i < str.length(); i++)
	{
		vec.push_back(str[i]);
	}
	if (str.length() > b* k || str.length() < a * k)
	{
		cout << "No Solution";
	}
	else
	{
		int x = n / k;
		int y = n % k;
		int res = 0;
		for (int i = 1; i <= y; i++)
		{
			for (int j = 0; j <= x; j++)
			{
				cout << str[res++];
			}
			printf("\n");
		}
		for (int i = 1; i <= k - y; i++)
		{
			for (int j = 0; j < x; j++)
			{
				cout << str[res++];
			}
			printf("\n");
		}
	}
}


#pragma warning(disable : 4996)
#include <iostream>
#include <string>
#include <list>
using namespace std;
int k, a, b;
string str;
list<char> vec;
int main(void)
{
	scanf("%d %d %d", &k, &a, &b);
	cin >> str;
	int n = str.length();
	for (int i = 0; i < str.length(); i++)
	{
		vec.push_back(str[i]);
	}
	if (str.length() > b* k || str.length() < a * k)
	{
		cout << "No solution";
	}
	else
	{
		int x = n / k;
		int y = n % k;
		int res = 0;
		for (int i = 1; i <= y; i++)
		{
			for (int j = 0; j <= x; j++)
			{
				cout << str[res++];
			}
			printf("\n");
		}
		for (int i = 1; i <= k - y; i++)
		{
			for (int j = 0; j < x; j++)
			{
				cout << str[res++];
			}
			printf("\n");
		}
	}
}


/*
Sucking Befor Fucking Is The Most Delicious Thing
Sexo
Sexualmente
*/
#include<iostream>
#include<math.h>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
#include<list>
#include<stack>
#include<map>
#include<deque>
#include<string>
#include<set>
#include<unordered_map>
#define IOT ios_base::sync_with_stdio(0);cin.tie(0);
#define Mod 1000000007
#define repi(a,n) for(int i=a;i<n;i++)
#define repj(a,n) for(int j=a;j<n;j++)
#define repk(a,n) for(int k=a;k<n;k++)
#define repe(a,n) for(int i=a;i<=n;i++)
#define TC  ll x; cin>>x; while(x--)
#define ull unsigned long long
#define ll long long
#define ld long double
using namespace std;
ll max(ll a, ll b)
{
	if (a >= b)return a;
	else return b;
}
ll min(ll a, ll b)
{
	if (a <= b)return a;
	else return b;
}
bool valid(ll n,ll m,int i, int j)
{
	if (i >= 0 && i < n && j >= 0 && j < m)return 1;
	else return 0;
}
void yes()
{
	cout << "YES" << endl;
}
void no()
{
	cout << "NO" << endl;
}
ll** a;
void declare_arr(ll r,ll c)
{
	a = new ll*[r];
	for (int i = 0; i < r; i++)
		a[i] = new ll[c];
	repi(0, r)
	{
		repj(0, c)
		{
			cin >> a[i][j];
		}
	}
}
/*map<ll, vector<ll> >graph;
bool vis[1000005];
bool dfs(ll root,ll n)
{
	if (root == n)return true;

	vis[root] = 1;
	for (auto adj : graph[root])
	{
		if (!vis[adj])
		{
			if (adj == n)return true;
			dfs(adj,n);
		}
	}
	return false;
}*/
vector<ll>v;
void cin_vec(ll sz)
{
	v.clear();
	repi(0, sz)
	{
		ll h; cin >> h; v.push_back(h);
	}
}
void bs(ll st, ll en,ll n)
{
	while (st <= en)
	{
		ll mid = (st + en) / 2;
		if (v[mid] <= n)
		{  st = mid + 1; }
		else en = mid - 1;
	}
}
void printDivisors(long long n)
{
	v.clear();
	for (int i = 1; i <= sqrt(n); i++)
	{
		if (n%i == 0)
		{
			if (n / i == i)
			{
				v.push_back(i);
			}
			else
			{
				v.push_back(i);
				v.push_back(n / i);
			}
		}
	}
}
/*map<string, ll>mp;
void subString(string s, ll n)
{
	// Pick starting point in outer loop
	// and lengths of different strings for
	// a given starting point
	mp.clear();
	for (int i = 0; i < n; i++)
	for (int len = 1; len <= n - i; len++)
		mp[s.substr(i, len)]++;
}*/
bool ispal(string s)
{
	for (int i = 0; i < s.size() / 2; i++)
	if (s[i] != s[s.size() - i - 1]) return false;

	return true;
}
/*bool prime[1000005];
	vector<ll>vp;
void SieveOfEratosthenes()
{
	memset(prime, true, sizeof(prime));
	prime[1] = false;

	for (int p = 2; p * p < 1000005; p++) {
		// If prime[p] is not changed, then it is a prime
		if (prime[p] == true) {
			// Update all multiples of p
			for (int i = p * 2; i < 1000005; i += p)
				prime[i] = false;
		}
	}
	repi(1, 1000005){ if (prime[i])vp.push_back(i); }
}*/
int gcd(ll a, ll b)
{
	if (!b)return a;
	return gcd(b, a%b);
}
ll fact(ll n)
{
	ll f = 1;
	for (int i = 1; i <= n; ++i)
	{
		f *= i;
	}
	return f;
}
ll fn(ll ii,ll jj,ll aa, ll b)
{
	ll c = 0;
	for (int k = ii; k < aa;k++)
	{
		for (int kk = jj; kk < b;kk++)
		{
			if (a[k][kk] == 1)
				c++;
		}
	}
	return c;
}
void main()
{
	ll k, a, b;
	cin >> k >> a >> b;
	string s;
	cin >> s;
	ll d =s.size()/k;
	if (d > b || d < a){ cout << "No solution" << endl; return; }
	int j = 0;
	repi(0, k)
	{
		if (j + d <= s.size()){
			if (i == k - 1)cout << s.substr(j,s.size()-j) << endl;
			else
			cout << s.substr(j, d) << endl;
		}
		j += d;
	}
}


/*
Sucking Befor Fucking Is The Most Delicious Thing
Sexo
Sexualmente
*/
#include<iostream>
#include<math.h>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
#include<list>
#include<stack>
#include<map>
#include<deque>
#include<string>
#include<set>
#include<unordered_map>
#define IOT ios_base::sync_with_stdio(0);cin.tie(0);
#define Mod 1000000007
#define repi(a,n) for(int i=a;i<n;i++)
#define repj(a,n) for(int j=a;j<n;j++)
#define repk(a,n) for(int k=a;k<n;k++)
#define repe(a,n) for(int i=a;i<=n;i++)
#define TC  ll x; cin>>x; while(x--)
#define ull unsigned long long
#define ll long long
#define ld long double
using namespace std;
ll max(ll a, ll b)
{
	if (a >= b)return a;
	else return b;
}
ll min(ll a, ll b)
{
	if (a <= b)return a;
	else return b;
}
bool valid(ll n,ll m,int i, int j)
{
	if (i >= 0 && i < n && j >= 0 && j < m)return 1;
	else return 0;
}
void yes()
{
	cout << "YES" << endl;
}
void no()
{
	cout << "NO" << endl;
}
ll** a;
void declare_arr(ll r,ll c)
{
	a = new ll*[r];
	for (int i = 0; i < r; i++)
		a[i] = new ll[c];
	repi(0, r)
	{
		repj(0, c)
		{
			cin >> a[i][j];
		}
	}
}
/*map<ll, vector<ll> >graph;
bool vis[1000005];
bool dfs(ll root,ll n)
{
	if (root == n)return true;

	vis[root] = 1;
	for (auto adj : graph[root])
	{
		if (!vis[adj])
		{
			if (adj == n)return true;
			dfs(adj,n);
		}
	}
	return false;
}*/
vector<ll>v;
void cin_vec(ll sz)
{
	v.clear();
	repi(0, sz)
	{
		ll h; cin >> h; v.push_back(h);
	}
}
void bs(ll st, ll en,ll n)
{
	while (st <= en)
	{
		ll mid = (st + en) / 2;
		if (v[mid] <= n)
		{  st = mid + 1; }
		else en = mid - 1;
	}
}
void printDivisors(long long n)
{
	v.clear();
	for (int i = 1; i <= sqrt(n); i++)
	{
		if (n%i == 0)
		{
			if (n / i == i)
			{
				v.push_back(i);
			}
			else
			{
				v.push_back(i);
				v.push_back(n / i);
			}
		}
	}
}
/*map<string, ll>mp;
void subString(string s, ll n)
{
	// Pick starting point in outer loop
	// and lengths of different strings for
	// a given starting point
	mp.clear();
	for (int i = 0; i < n; i++)
	for (int len = 1; len <= n - i; len++)
		mp[s.substr(i, len)]++;
}*/
bool ispal(string s)
{
	for (int i = 0; i < s.size() / 2; i++)
	if (s[i] != s[s.size() - i - 1]) return false;

	return true;
}
/*bool prime[1000005];
	vector<ll>vp;
void SieveOfEratosthenes()
{
	memset(prime, true, sizeof(prime));
	prime[1] = false;

	for (int p = 2; p * p < 1000005; p++) {
		// If prime[p] is not changed, then it is a prime
		if (prime[p] == true) {
			// Update all multiples of p
			for (int i = p * 2; i < 1000005; i += p)
				prime[i] = false;
		}
	}
	repi(1, 1000005){ if (prime[i])vp.push_back(i); }
}*/
int gcd(ll a, ll b)
{
	if (!b)return a;
	return gcd(b, a%b);
}
ll fact(ll n)
{
	ll f = 1;
	for (int i = 1; i <= n; ++i)
	{
		f *= i;
	}
	return f;
}
ll fn(ll ii,ll jj,ll aa, ll b)
{
	ll c = 0;
	for (int k = ii; k < aa;k++)
	{
		for (int kk = jj; kk < b;kk++)
		{
			if (a[k][kk] == 1)
				c++;
		}
	}
	return c;
}
void main()
{
	ll k, a, b;
	cin >> k >> a >> b;
	string s;
	cin >> s;
	ll d = ceil((double)s.size()/(double)k);
	if (d > b || d < a){ cout << "No solutaion" << endl; return; }
	int j = 0;
	repi(0, k)
	{
		cout << s.substr(j,d) << endl;
		j += d;
	}
}


/*
Sucking Befor Fucking Is The Most Delicious Thing
Sexo
Sexualmente
*/
#include<iostream>
#include<math.h>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
#include<list>
#include<stack>
#include<map>
#include<deque>
#include<string>
#include<set>
#include<unordered_map>
#define IOT ios_base::sync_with_stdio(0);cin.tie(0);
#define Mod 1000000007
#define repi(a,n) for(int i=a;i<n;i++)
#define repj(a,n) for(int j=a;j<n;j++)
#define repk(a,n) for(int k=a;k<n;k++)
#define repe(a,n) for(int i=a;i<=n;i++)
#define TC  ll x; cin>>x; while(x--)
#define ull unsigned long long
#define ll long long
#define ld long double
using namespace std;
ll max(ll a, ll b)
{
	if (a >= b)return a;
	else return b;
}
ll min(ll a, ll b)
{
	if (a <= b)return a;
	else return b;
}
bool valid(ll n,ll m,int i, int j)
{
	if (i >= 0 && i < n && j >= 0 && j < m)return 1;
	else return 0;
}
void yes()
{
	cout << "YES" << endl;
}
void no()
{
	cout << "NO" << endl;
}
ll** a;
void declare_arr(ll r,ll c)
{
	a = new ll*[r];
	for (int i = 0; i < r; i++)
		a[i] = new ll[c];
	repi(0, r)
	{
		repj(0, c)
		{
			cin >> a[i][j];
		}
	}
}
/*map<ll, vector<ll> >graph;
bool vis[1000005];
bool dfs(ll root,ll n)
{
	if (root == n)return true;

	vis[root] = 1;
	for (auto adj : graph[root])
	{
		if (!vis[adj])
		{
			if (adj == n)return true;
			dfs(adj,n);
		}
	}
	return false;
}*/
vector<ll>v;
void cin_vec(ll sz)
{
	v.clear();
	repi(0, sz)
	{
		ll h; cin >> h; v.push_back(h);
	}
}
void bs(ll st, ll en,ll n)
{
	while (st <= en)
	{
		ll mid = (st + en) / 2;
		if (v[mid] <= n)
		{  st = mid + 1; }
		else en = mid - 1;
	}
}
void printDivisors(long long n)
{
	v.clear();
	for (int i = 1; i <= sqrt(n); i++)
	{
		if (n%i == 0)
		{
			if (n / i == i)
			{
				v.push_back(i);
			}
			else
			{
				v.push_back(i);
				v.push_back(n / i);
			}
		}
	}
}
/*map<string, ll>mp;
void subString(string s, ll n)
{
	// Pick starting point in outer loop
	// and lengths of different strings for
	// a given starting point
	mp.clear();
	for (int i = 0; i < n; i++)
	for (int len = 1; len <= n - i; len++)
		mp[s.substr(i, len)]++;
}*/
bool ispal(string s)
{
	for (int i = 0; i < s.size() / 2; i++)
	if (s[i] != s[s.size() - i - 1]) return false;

	return true;
}
/*bool prime[1000005];
	vector<ll>vp;
void SieveOfEratosthenes()
{
	memset(prime, true, sizeof(prime));
	prime[1] = false;

	for (int p = 2; p * p < 1000005; p++) {
		// If prime[p] is not changed, then it is a prime
		if (prime[p] == true) {
			// Update all multiples of p
			for (int i = p * 2; i < 1000005; i += p)
				prime[i] = false;
		}
	}
	repi(1, 1000005){ if (prime[i])vp.push_back(i); }
}*/
int gcd(ll a, ll b)
{
	if (!b)return a;
	return gcd(b, a%b);
}
ll fact(ll n)
{
	ll f = 1;
	for (int i = 1; i <= n; ++i)
	{
		f *= i;
	}
	return f;
}
ll fn(ll ii,ll jj,ll aa, ll b)
{
	ll c = 0;
	for (int k = ii; k < aa;k++)
	{
		for (int kk = jj; kk < b;kk++)
		{
			if (a[k][kk] == 1)
				c++;
		}
	}
	return c;
}
void main()
{
	ll k, a, b;
	cin >> k >> a >> b;
	string s;
	cin >> s;
	ll d = ceil((double)s.size()/(double)k);
	if (d > b || d < a){ cout << "No solution" << endl; return; }
	int j = 0;
	repi(0, k)
	{
		cout << s.substr(j,d) << endl;
		j += d;
	}
}


/*
Sucking Befor Fucking Is The Most Delicious Thing
Sexo
Sexualmente
*/
#include<iostream>
#include<math.h>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
#include<list>
#include<stack>
#include<map>
#include<deque>
#include<string>
#include<set>
#include<unordered_map>
#define IOT ios_base::sync_with_stdio(0);cin.tie(0);
#define Mod 1000000007
#define repi(a,n) for(int i=a;i<n;i++)
#define repj(a,n) for(int j=a;j<n;j++)
#define repk(a,n) for(int k=a;k<n;k++)
#define repe(a,n) for(int i=a;i<=n;i++)
#define TC  ll x; cin>>x; while(x--)
#define ull unsigned long long
#define ll long long
#define ld long double
using namespace std;
ll max(ll a, ll b)
{
	if (a >= b)return a;
	else return b;
}
ll min(ll a, ll b)
{
	if (a <= b)return a;
	else return b;
}
bool valid(ll n,ll m,int i, int j)
{
	if (i >= 0 && i < n && j >= 0 && j < m)return 1;
	else return 0;
}
void yes()
{
	cout << "YES" << endl;
}
void no()
{
	cout << "NO" << endl;
}
ll** a;
void declare_arr(ll r,ll c)
{
	a = new ll*[r];
	for (int i = 0; i < r; i++)
		a[i] = new ll[c];
	repi(0, r)
	{
		repj(0, c)
		{
			cin >> a[i][j];
		}
	}
}
/*map<ll, vector<ll> >graph;
bool vis[1000005];
bool dfs(ll root,ll n)
{
	if (root == n)return true;

	vis[root] = 1;
	for (auto adj : graph[root])
	{
		if (!vis[adj])
		{
			if (adj == n)return true;
			dfs(adj,n);
		}
	}
	return false;
}*/
vector<ll>v;
void cin_vec(ll sz)
{
	v.clear();
	repi(0, sz)
	{
		ll h; cin >> h; v.push_back(h);
	}
}
void bs(ll st, ll en,ll n)
{
	while (st <= en)
	{
		ll mid = (st + en) / 2;
		if (v[mid] <= n)
		{  st = mid + 1; }
		else en = mid - 1;
	}
}
void printDivisors(long long n)
{
	v.clear();
	for (int i = 1; i <= sqrt(n); i++)
	{
		if (n%i == 0)
		{
			if (n / i == i)
			{
				v.push_back(i);
			}
			else
			{
				v.push_back(i);
				v.push_back(n / i);
			}
		}
	}
}
/*map<string, ll>mp;
void subString(string s, ll n)
{
	// Pick starting point in outer loop
	// and lengths of different strings for
	// a given starting point
	mp.clear();
	for (int i = 0; i < n; i++)
	for (int len = 1; len <= n - i; len++)
		mp[s.substr(i, len)]++;
}*/
bool ispal(string s)
{
	for (int i = 0; i < s.size() / 2; i++)
	if (s[i] != s[s.size() - i - 1]) return false;

	return true;
}
/*bool prime[1000005];
	vector<ll>vp;
void SieveOfEratosthenes()
{
	memset(prime, true, sizeof(prime));
	prime[1] = false;

	for (int p = 2; p * p < 1000005; p++) {
		// If prime[p] is not changed, then it is a prime
		if (prime[p] == true) {
			// Update all multiples of p
			for (int i = p * 2; i < 1000005; i += p)
				prime[i] = false;
		}
	}
	repi(1, 1000005){ if (prime[i])vp.push_back(i); }
}*/
int gcd(ll a, ll b)
{
	if (!b)return a;
	return gcd(b, a%b);
}
ll fact(ll n)
{
	ll f = 1;
	for (int i = 1; i <= n; ++i)
	{
		f *= i;
	}
	return f;
}
ll fn(ll ii,ll jj,ll aa, ll b)
{
	ll c = 0;
	for (int k = ii; k < aa;k++)
	{
		for (int kk = jj; kk < b;kk++)
		{
			if (a[k][kk] == 1)
				c++;
		}
	}
	return c;
}
void main()
{
	ll k, a, b;
	cin >> k >> a >> b;
	string s;
	cin >> s;
	ll d =s.size()/k;
	int j = 0;
	vector<string>v;
	repi(0, k)
	{
		if (j + d <= s.size()){
			if (i == k - 1) v.push_back(s.substr(j, s.size() - j));
			else
			v.push_back( s.substr(j, d));
		}
		j += d;
	}
	repi(0, v.size())
	{
		if (v[i].size()>b||v[i].size()<a)
		{
			cout << "No solution" << endl; return;
		}
	}
	repi(0, v.size())
	{
		cout << v[i] << endl;
	}

}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	cnt = len % k;
	tmp = len / k + +(cnt != 0);
	if(k*a > len)cout << "No solution";
	else if (a <= tmp && tmp <= b) {
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0) {
				tmp--;
				cnt--;
			}
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	cnt = len % k;
	tmp = len / k + +(cnt != 0);
	if (a <= tmp && tmp <= b) {
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0) {
				tmp--;
				cnt--;
			}
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	cnt = len % k;
	tmp = len / k;
	tmp += (cnt != 0 && tmp != 0);
	if (a <= tmp && tmp <= b) {
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0)tmp--;
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	tmp = len / k;
	cnt = len % k;
	if (a <= tmp && tmp + (cnt!=0) <= b) {
		tmp += 1;
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0) {
				tmp--;
				cnt--;
			}
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	tmp = len / k;
	cnt = len % k;
	if (a <= tmp && tmp + 1 <= b) {
		tmp += 1;
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0) {
				tmp--;
				cnt--;
			}
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	tmp = len / k;
	cnt = len % k;
	if (a <= tmp && tmp <= b) {
		tmp += 1;
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0) {
				tmp--;
				cnt--;
			}
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	tmp = len / k + 1 - (len%k == 0);
	if (a <= tmp && tmp <= b) {
		for (int i = 0; i < len; ++i) {
			cout << str[i];
			if (i%tmp == tmp - 1)cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <numeric>
#include <functional>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <string>
#include <fstream>
using namespace std;

long long gcd(long long a, long long b) {
	while (b) {
		a %= b;
		swap(a, b);
	}
	return a;
}

long long gcd2(long long a, long long b, long long& x, long long& y) {
	if (a == 0) {
		x = 0; y = 1;
		return b;
	}
	long long x1, y1;
	long long d = gcd2(b%a, a, x1, y1);
	x = y1 - (b / a) * x1;
	y = x1;
	return d;
}
long long lcm(long long  a, long long  b) {
	return a * b / gcd(a, b);
}

int mod = 1000000007;

inline int add(int a, int b) {
	int ret = a + b;
	if (ret >= mod)
		ret -= mod;
	return ret;
}

bool find_any_solution(long long a, long long b, long long c, long long& x0, long long& y0, long long& g) {
	g = gcd2(abs(a), abs(b), x0, y0);
	if (c % g != 0)
		return false;
	x0 *= c / g;
	y0 *= c / g;
	if (a < 0)   x0 *= -1;
	if (b < 0)   y0 *= -1;
	return true;
}

void shift_solution(long long & x, long long & y, long long a, long long b, long long cnt) {
	x += cnt * b;
	y -= cnt * a;
}

const double pi = 3.14159265358979323846;
long long dp[100][100][100];
int c[100];
long long p[100][100];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	string str;
	int k, a, b, tmp, len,cnt, j = 0;
	cin >> k >> a >> b;
	cin >> str;
	len = str.length();
	cnt = len % k;
	tmp = len / k;
	if (a <= tmp && tmp + (cnt != 0) <= b) {
		tmp += cnt != 0;
		for (int j = 0; j < len; j += tmp)
		while(j < len){
			for (int i = 0; i < tmp; ++i) {
				cout << str[i+j];
			}
			j += tmp;
			cnt--;
			if (cnt == 0)tmp--;
			cout << '\n';
		}
	}
	else cout << "No solution";
	/*system("pause");*/
	return 0;
}


/*

╔══╗╔╗─╔╗╔════╗╔╗╔╗──╔══╗╔╗╔╗╔══╗
║╔╗║║╚═╝║╚═╗╔═╝║║║║──║╔═╝║║║║║╔═╝
║╚╝║║╔╗─║──║║──║╚╝║──║╚═╗║║║║║╚═╗
║╔╗║║║╚╗║──║║──╚═╗║──║╔═╝║║║║║╔═╝
║║║║║║─║║──║║───╔╝║──║║──║╚╝║║║
╚╝╚╝╚╝─╚╝──╚╝───╚═╝──╚╝──╚══╝╚╝

Sviatoslav Bidzilia 2019

*/

#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
#include <bitset>
#include <map>
#include <queue>
#include <ctime>
#include <stack>
#include <set>
#include <list>
#include <deque>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <stdarg.h>
#include <utility>

using namespace std;

#define pb push_back
#define mp make_pair
#define ll long long
#define all(a) a.begin(), a.end()
#define SORT(a) sort(all(a))
#define pii pair<int, int>
#define inf 1e17
#define e 1e-7
#define PI acos(-1)
#define vi vector<int>
#define F first
#define S second

template<typename T, typename SS>
ostream& operator<<(ostream& ofs, const pair<T, SS>& p)
{
	ofs << "( " << p.F << " , " << p.S << " )";
	return ofs;
}
template<typename T>
void update_max(T last, T& mx)
{
	mx = max(mx, last);
}
template<typename T>
void update_min(T last, T& mx)
{
	mx = min(mx, last);
}
template<typename T>
void update_sum(T last, T& mx)
{
	mx += last;
}
template<typename T>
void print_one(T a)
{
	cout << a << ' ';
}
template<typename T, typename... Args>
T max(Args&& ... args)
{
	T mx = -inf;
	T dummy[] = { 0, ((void)update_max(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename T, typename... Args>
T min(Args&& ... args)
{
	T mx = inf;
	T dummy[] = { 0, ((void)update_min(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename T, typename... Args>
T sum(Args&& ... args)
{
	T mx = 0;
	T dummy[] = { 0, ((void)update_sum(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename... Args>
void print(Args&& ... args)
{
	int dummy[] = { 0, ((void)print_one(std::forward<Args>(args)),0)... };
	cout << '\n';
}
template<typename T>
void print(vector<T> a)
{
	for (auto i : a)
		cout << i << ' ';
	cout << '\n';
}
template<typename T>
T max(vector<T> a)
{
	T mx = -inf;
	for (auto i : a)
		mx = max(i, mx);

	return (T)mx;
}
template<typename T>
T min(vector<T> a)
{
	T mx = inf;
	for (auto i : a)
		mx = min(i, mx);

	return (T)mx;
}
template<typename T>
T sum(vector<T> a)
{
	T mx = 0;
	for (auto i : a)
		mx += i;
	return mx;
}
#define NO return cout <<"No solution\n", 0
int main()
{
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	srand(time(NULL));
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(false);
	string s;
	int k, a, b;
	cin >> k >> a >> b;
	cin >> s;
	int n = s.size();
	vi c(k, a);
	int sum = k * a;
	int i = 0;
	while (sum != n)
	{
		if (c[i] == b)
			i++;
		if (i >= c.size())
			NO;
		c[i] ++;
		sum++;
	}
	i = 0;
	int t = 0;
	while (i < n)
	{
		for (int j = 0; j < c[t]; j++)
			cout << s[i + j];
		i += c[t++];
		cout << '\n';
	}
}


/*

╔══╗╔╗─╔╗╔════╗╔╗╔╗──╔══╗╔╗╔╗╔══╗
║╔╗║║╚═╝║╚═╗╔═╝║║║║──║╔═╝║║║║║╔═╝
║╚╝║║╔╗─║──║║──║╚╝║──║╚═╗║║║║║╚═╗
║╔╗║║║╚╗║──║║──╚═╗║──║╔═╝║║║║║╔═╝
║║║║║║─║║──║║───╔╝║──║║──║╚╝║║║
╚╝╚╝╚╝─╚╝──╚╝───╚═╝──╚╝──╚══╝╚╝

Sviatoslav Bidzilia 2019

*/

#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
#include <bitset>
#include <map>
#include <queue>
#include <ctime>
#include <stack>
#include <set>
#include <list>
#include <deque>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <stdarg.h>
#include <utility>

using namespace std;

#define pb push_back
#define mp make_pair
#define ll long long
#define all(a) a.begin(), a.end()
#define SORT(a) sort(all(a))
#define pii pair<int, int>
#define inf 1e17
#define e 1e-7
#define PI acos(-1)
#define vi vector<int>
#define F first
#define S second

template<typename T, typename SS>
ostream& operator<<(ostream& ofs, const pair<T, SS>& p)
{
	ofs << "( " << p.F << " , " << p.S << " )";
	return ofs;
}
template<typename T>
void update_max(T last, T& mx)
{
	mx = max(mx, last);
}
template<typename T>
void update_min(T last, T& mx)
{
	mx = min(mx, last);
}
template<typename T>
void update_sum(T last, T& mx)
{
	mx += last;
}
template<typename T>
void print_one(T a)
{
	cout << a << ' ';
}
template<typename T, typename... Args>
T max(Args&& ... args)
{
	T mx = -inf;
	T dummy[] = { 0, ((void)update_max(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename T, typename... Args>
T min(Args&& ... args)
{
	T mx = inf;
	T dummy[] = { 0, ((void)update_min(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename T, typename... Args>
T sum(Args&& ... args)
{
	T mx = 0;
	T dummy[] = { 0, ((void)update_sum(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename... Args>
void print(Args&& ... args)
{
	int dummy[] = { 0, ((void)print_one(std::forward<Args>(args)),0)... };
	cout << '\n';
}
template<typename T>
void print(vector<T> a)
{
	for (auto i : a)
		cout << i << ' ';
	cout << '\n';
}
template<typename T>
T max(vector<T> a)
{
	T mx = -inf;
	for (auto i : a)
		mx = max(i, mx);

	return (T)mx;
}
template<typename T>
T min(vector<T> a)
{
	T mx = inf;
	for (auto i : a)
		mx = min(i, mx);

	return (T)mx;
}
template<typename T>
T sum(vector<T> a)
{
	T mx = 0;
	for (auto i : a)
		mx += i;
	return mx;
}
#define NO return cout <<"No solution\n", 0
int main()
{
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	srand(time(NULL));
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(false);
	string s;
	int k, a, b;
	cin >> k >> a >> b;
	cin >> s;
	int n = s.size();
	vi c(k, a);
	int sum = k * a;
	int i = 0;
	while (sum != n)
	{
		while (c[i] == b)
			i++;
		if (i >= c.size())
			NO;
		c[i] ++;
		sum++;
	}
	i = 0;
	int t = 0;
	while (i < n)
	{
		for (int j = 0; j < c[t]; j++)
			cout << s[i + j];
		i += c[t++];
		cout << '\n';
	}
}


/*

╔══╗╔╗─╔╗╔════╗╔╗╔╗──╔══╗╔╗╔╗╔══╗
║╔╗║║╚═╝║╚═╗╔═╝║║║║──║╔═╝║║║║║╔═╝
║╚╝║║╔╗─║──║║──║╚╝║──║╚═╗║║║║║╚═╗
║╔╗║║║╚╗║──║║──╚═╗║──║╔═╝║║║║║╔═╝
║║║║║║─║║──║║───╔╝║──║║──║╚╝║║║
╚╝╚╝╚╝─╚╝──╚╝───╚═╝──╚╝──╚══╝╚╝

Sviatoslav Bidzilia 2019

*/

#include <iostream>
#include <cmath>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#include <string>
#include <cstdlib>
#include <vector>
#include <bitset>
#include <map>
#include <queue>
#include <ctime>
#include <stack>
#include <set>
#include <list>
#include <deque>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <stdarg.h>
#include <utility>

using namespace std;

#define pb push_back
#define mp make_pair
#define ll long long
#define all(a) a.begin(), a.end()
#define SORT(a) sort(all(a))
#define pii pair<int, int>
#define inf 1e17
#define e 1e-7
#define PI acos(-1)
#define vi vector<int>
#define F first
#define S second

template<typename T, typename SS>
ostream& operator<<(ostream& ofs, const pair<T, SS>& p)
{
	ofs << "( " << p.F << " , " << p.S << " )";
	return ofs;
}
template<typename T>
void update_max(T last, T& mx)
{
	mx = max(mx, last);
}
template<typename T>
void update_min(T last, T& mx)
{
	mx = min(mx, last);
}
template<typename T>
void update_sum(T last, T& mx)
{
	mx += last;
}
template<typename T>
void print_one(T a)
{
	cout << a << ' ';
}
template<typename T, typename... Args>
T max(Args&& ... args)
{
	T mx = -inf;
	T dummy[] = { 0, ((void)update_max(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename T, typename... Args>
T min(Args&& ... args)
{
	T mx = inf;
	T dummy[] = { 0, ((void)update_min(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename T, typename... Args>
T sum(Args&& ... args)
{
	T mx = 0;
	T dummy[] = { 0, ((void)update_sum(std::forward<Args>(args), mx),0)... };
	return mx;
}
template<typename... Args>
void print(Args&& ... args)
{
	int dummy[] = { 0, ((void)print_one(std::forward<Args>(args)),0)... };
	cout << '\n';
}
template<typename T>
void print(vector<T> a)
{
	for (auto i : a)
		cout << i << ' ';
	cout << '\n';
}
template<typename T>
T max(vector<T> a)
{
	T mx = -inf;
	for (auto i : a)
		mx = max(i, mx);

	return (T)mx;
}
template<typename T>
T min(vector<T> a)
{
	T mx = inf;
	for (auto i : a)
		mx = min(i, mx);

	return (T)mx;
}
template<typename T>
T sum(vector<T> a)
{
	T mx = 0;
	for (auto i : a)
		mx += i;
	return mx;
}
int main()
{
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	srand(time(NULL));
	cin.tie(0);
	cout.tie(0);
	ios_base::sync_with_stdio(false);
	string s;
	int k, a, b;
	cin >> k >> a >> b;
	cin >> s;
	for (int c = a; c <= b; c++)
		if (ceil((double)s.size() / c) == k)
		{
			for (int i = 0; i < k; i++, cout << '\n')
				for (int j = 0; j < c && i * c + j < s.size(); j++)
					cout << s[i * c + j];
			return 0;
		}
	cout << "No solution\n";
}


#include<iostream>
#include<string>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<algorithm>
#include<unordered_map>
#include<vector>
using namespace std;
#define Fori(s,e) for(long long i=s;i<e;i++)
#define Forj(s,e) for(long long j=s;j<e;j++)
#define Forjd(s,e) for(long long j=s-1;j>=e;j--)
#define Fork(s,e) for(long long k=s;k<e;k++)
#define Forl(s,e) for(long long l=s;l<e;l++)
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)

set<long long> getDivs(long long number){
	set<long long>st;
	Fori(1, sqrt(number) + 1){
		if (number%i == 0){
			st.insert(number / i);
			st.insert(i);
		}
	}
	return st;
}
bool isPalndrome(string str){
	if (str.length() == 1 || str.length() == 0){
		return true;
	}
	bool faild = false;
	Fori(0, (str.length() / 2) + 1){
		if (str[i] != str[str.length() - i - 1]){
			faild = true;
			break;
		}
	}
	return !faild;
}

long long max(long long f, long long s, long long t)
{
	if (f > s && f > t)
		return f;
	else 	if (s > f && s > t)
		return s;
	else 	if (t > f && t > s)
		return t;

}
long long min(long long f, long long s, long long t)
{
	if (f < s && f < t)
		return f;
	else 	if (s < f && s < t)
		return s;
	else 	if (t < f && t < s)
		return t;
}

long long getDistance(long long f, long long s, long long t){
	return max(f, s, t) - min(f, s, t) + 1;
}

void dfs(){
	map<int, vector<int>>mp;
	int size, count = 2, num, res = 0;
	cin >> size;
	int*color = new int[size + 1];
	int*wanted = new int[size + 1];
	color[1] = 0;
	Fori(0, size - 1){
		cin >> num;
		color[count] = 0;
		mp[num].push_back(count);
		count++;
	}

	Fori(1, size + 1){
		cin >> wanted[i];
	}

	count = 1;
	stack<int>st;
	int current;
	Fori(1, size + 1){
		if (color[count] != wanted[count]){
			st.push(count);
			while (st.size() != 0){
				current = st.top();
				st.pop();
				color[current] = wanted[count];
				Forj(0, mp[current].size()){
					st.push(mp[current][j]);
				}
			}
			res++;
		}
		count++;
	}

	cout << res << endl;
}

vector<long long> findDivs(long long number){
	vector<long long>vec;
	Fori(1, sqrt(number) + 1){
		if (number%i == 0){
			if (number / i != i){
				vec.push_back(number / i);
				vec.push_back(i);
			}
			else
				vec.push_back(number / i);
		}
	}
	return vec;
}

vector<long long> numOfDiffs(string str1, string str2, long long num){
	vector<long long> vec;
	Fori(0, str1.length()){
		if (str1[i] != str2[i + num])
			vec.push_back(i + 1);
	}
	return vec;
}

int gcd(int a, int b) {
	if (b == 0)
		return a;
	return gcd(b, a % b);
}

long long bst(vector<long long>arr, long long start, long long end, long long number){
	long long mid;
	while (start <= end)
	{
		mid = (start + end) / 2;

		if ((arr[mid] <= number && arr[mid + 1] > number)){
			return mid;
		}
		else if (arr[mid] > number)
			end = mid - 1;
		else if (arr[mid] <= number)
			start = mid + 1;
	}
	return 0;
}

long long min2(long long first, long long second){
	return first <= second ? first : second;
}

void main(){
	speed;
	long long lines, min, max;
	cin >> lines >> min >> max;
	string str;
	cin >> str;
	long long count = min;
	while (count <= max){
		count++;
		if ((str.size() - ((lines - 1)*count)) >= min && (str.size() - ((lines - 1)*count)) <= max)
			break;
	}
	if ((str.size() - ((lines - 1)*count)) >= min && (str.size() - ((lines - 1)*count)) <= max && count <= max){
		long long cnt = 0;
		Fori (0,lines - 1){
			cout << str.substr(cnt, count) << endl;
			cnt += count;
		}
		cout << str.substr(cnt, (str.size() - cnt)) << endl;

	}
	else{
		cout << "No solution" << endl;
	}
}


#include<iostream>
#include<string>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<algorithm>
#include<unordered_map>
#include<vector>
using namespace std;
#define Fori(s,e) for(long long i=s;i<e;i++)
#define Forj(s,e) for(long long j=s;j<e;j++)
#define Forjd(s,e) for(long long j=s-1;j>=e;j--)
#define Fork(s,e) for(long long k=s;k<e;k++)
#define Forl(s,e) for(long long l=s;l<e;l++)
#define speed ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)

set<long long> getDivs(long long number){
	set<long long>st;
	Fori(1, sqrt(number) + 1){
		if (number%i == 0){
			st.insert(number / i);
			st.insert(i);
		}
	}
	return st;
}
bool isPalndrome(string str){
	if (str.length() == 1 || str.length() == 0){
		return true;
	}
	bool faild = false;
	Fori(0, (str.length() / 2) + 1){
		if (str[i] != str[str.length() - i - 1]){
			faild = true;
			break;
		}
	}
	return !faild;
}

long long max(long long f, long long s, long long t)
{
	if (f > s && f > t)
		return f;
	else 	if (s > f && s > t)
		return s;
	else 	if (t > f && t > s)
		return t;

}
long long min(long long f, long long s, long long t)
{
	if (f < s && f < t)
		return f;
	else 	if (s < f && s < t)
		return s;
	else 	if (t < f && t < s)
		return t;
}

long long getDistance(long long f, long long s, long long t){
	return max(f, s, t) - min(f, s, t) + 1;
}

void dfs(){
	map<int, vector<int>>mp;
	int size, count = 2, num, res = 0;
	cin >> size;
	int*color = new int[size + 1];
	int*wanted = new int[size + 1];
	color[1] = 0;
	Fori(0, size - 1){
		cin >> num;
		color[count] = 0;
		mp[num].push_back(count);
		count++;
	}

	Fori(1, size + 1){
		cin >> wanted[i];
	}

	count = 1;
	stack<int>st;
	int current;
	Fori(1, size + 1){
		if (color[count] != wanted[count]){
			st.push(count);
			while (st.size() != 0){
				current = st.top();
				st.pop();
				color[current] = wanted[count];
				Forj(0, mp[current].size()){
					st.push(mp[current][j]);
				}
			}
			res++;
		}
		count++;
	}

	cout << res << endl;
}

vector<long long> findDivs(long long number){
	vector<long long>vec;
	Fori(1, sqrt(number) + 1){
		if (number%i == 0){
			if (number / i != i){
				vec.push_back(number / i);
				vec.push_back(i);
			}
			else
				vec.push_back(number / i);
		}
	}
	return vec;
}

vector<long long> numOfDiffs(string str1, string str2, long long num){
	vector<long long> vec;
	Fori(0, str1.length()){
		if (str1[i] != str2[i + num])
			vec.push_back(i + 1);
	}
	return vec;
}

int gcd(int a, int b) {
	if (b == 0)
		return a;
	return gcd(b, a % b);
}

long long bst(vector<long long>arr, long long start, long long end, long long number){
	long long mid;
	while (start <= end)
	{
		mid = (start + end) / 2;

		if ((arr[mid] <= number && arr[mid + 1] > number)){
			return mid;
		}
		else if (arr[mid] > number)
			end = mid - 1;
		else if (arr[mid] <= number)
			start = mid + 1;
	}
	return 0;
}

long long min2(long long first, long long second){
	return first <= second ? first : second;
}

void main(){
	speed;
	long long lines, min, max;
	cin >> lines >> min >> max;
	string str;
	cin >> str;
	long long count = min;
	while (count <= max){
		if ((str.size() - ((lines - 1)*count)) >= min && (str.size() - ((lines - 1)*count)) <= max)
			break;
		count++;
	}
	if ((str.size() - ((lines - 1)*count)) >= min && (str.size() - ((lines - 1)*count)) <= max && count <= max){
		long long cnt = 0;
		Fori (0,lines - 1){
			cout << str.substr(cnt, count) << endl;
			cnt += count;
		}
		cout << str.substr(cnt, (str.size() - cnt)) << endl;

	}
	else{
		cout << "No solution" << endl;
	}
}