#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
#pragma GCC target("avx2")
using namespace std;
template <class T>
T _read() {
  T x;
  cin >> x;
  return x;
}
template <class T>
long long sum(vector<T> &a) {
  long long x = 0;
  for (int _i = 0; _i < a.size(); ++_i) x += a[_i];
  return x;
}
template <class InputIt, class T>
typename iterator_traits<InputIt>::difference_type rcount(InputIt first,
                                                          InputIt last,
                                                          const T &value) {
  typename iterator_traits<InputIt>::difference_type ret = 0;
  for (; first != last; ++first) {
    if (*first != value) ret++;
  }
  return ret;
}
bool contains(string &s, char x) {
  for (size_t i = 0; i < s.size(); ++i) {
    if (s[i] == x) {
      return true;
    }
  }
  return false;
}
template <class T>
bool contains(vector<T> &a, T x) {
  for (size_t i = 0; i < a.size(); ++i) {
    if (a[i] == x) {
      return true;
    }
  }
  return false;
}
string cut(string &s, int start, int end) {
  string r;
  while (max(start, 0) < min((int)s.size(), end)) {
    r += s[start++];
  }
  return r;
}
template <class T>
vector<T> cut(vector<T> &a, int start, int end) {
  vector<T> r;
  while (max(start, 0) < min((int)a.size(), end)) {
    r.emplace_back(a[start++]);
  }
  return r;
}
template <class T1, class T2>
bool equal(vector<T1> &a, vector<T2> &b) {
  if (a.size() != b.size()) return false;
  for (size_t i = 0; i < a.size(); ++i)
    if (a[i] != b[i]) return false;
  return true;
}
template <class T>
T gcd(T a, T b) {
  while (b) {
    a %= b;
    swap(a, b);
  }
  return a;
}
template <class T>
T gcd(T a, T b, T &x, T &y) {
  if (a == 0) {
    x = 0;
    y = 1;
    return b;
  }
  int x1, y1;
  int d = gcd(b % a, a, x1, y1);
  x = y1 - (b / a) * x1;
  y = x1;
  return d;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
long long binpow(long long a, unsigned int n) {
  long long r = 1;
  while (n) {
    if (n & 1) r *= a;
    a *= a;
    n >>= 1;
  }
  return r;
}
bool isPrime(long long num) {
  if (num <= 1 || num % 2 == 0) return false;
  int upperLimit = (int)(sqrt((double)num) + 1);
  for (int divisor = 3; divisor <= upperLimit; divisor += 2) {
    if (num % divisor == 0) return false;
  }
  return true;
}
template <class T>
vector<long long> prefSumm(vector<T> a) {
  vector<long long> pref_summ(a.size());
  pref_summ[0] = (long long)a[0];
  for (size_t i = 1; i < a.size(); ++i) {
    pref_summ[i] = pref_summ[i - 1] + (long long)a[i];
  }
  return pref_summ;
}
template <class T>
vector<int> prefixFunction(vector<T> a) {
  int n = (int)a.length();
  vector<int> prefix_function(n);
  for (int i = 1; i < n; ++i) {
    int j = prefix_function[i - 1];
    while (j > 0 && a[i] != a[j]) j = prefix_function[j - 1];
    if (a[i] == a[j]) ++j;
    prefix_function[i] = j;
  }
  return prefix_function;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int k, a, b;
  string s;
  cin >> k >> a >> b >> s;
  if (s.length() < k * a || k * b < s.length()) {
    cout << "No solution" << endl;
  } else {
    int cur = 0, h;
    for (int i = 0; i < k; ++i) {
      h = (s.length() - cur) / (k - i);
      for (int j = cur; j < cur + h; ++j) {
        cout << s[j];
      }
      cout << endl;
      cur += h;
    }
  }
}
