Anfisa the monkey learns to type. She is yet unfamiliar with the "space" key and can only type in lower-case Latin letters. Having typed for a fairly long line, Anfisa understood that it would be great to divide what she has written into k lines not shorter than a and not longer than b, for the text to resemble human speech more. Help Anfisa.

Input

The first line contains three integers k, a and b (1 ≤ k ≤ 200, 1 ≤ a ≤ b ≤ 200). The second line contains a sequence of lowercase Latin letters — the text typed by Anfisa. It is guaranteed that the given line is not empty and its length does not exceed 200 symbols.

Output

Print k lines, each of which contains no less than a and no more than b symbols — Anfisa's text divided into lines. It is not allowed to perform any changes in the text, such as: deleting or adding symbols, changing their order, etc. If the solution is not unique, print any of them. If there is no solution, print "No solution" (without quotes). 

Examples

Input

3 2 5
abrakadabra


Output

ab
rakad
abra


Input

4 1 2
abrakadabra


Output

No solution
import java.io.*;
import java.util.*;
import java.util.stream.*;

public class AnfisaTheMonkey {
    private static boolean debug = false;

    private static int K, A, B;
    private static String str;

    private static void solveProblem(InputStream instr) {
        Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(instr)));
        int testCount = 1;
        if (debug) {
            testCount = sc.nextInt();
        }

        for (int t = 1; t <= testCount; t++) {
            printDebug("------ " + t + " ------");
            K = sc.nextInt();
            A = sc.nextInt();
            B = sc.nextInt();
            str = sc.next();
            Object result = solveTestCase();
            System.out.println(result);
        }
    }

    private static Object solveTestCase() {
        if (str.length() < K * A || str.length() > K * B) {
            return "No solution";
        }
        int N = str.length();
        boolean dp[][] = new boolean[N + 1][K + 1];
        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= K; j++) {
                dp[i][j] = (i >= j * A && i <= j * B);
            }
        }

        List<String> lines = new ArrayList<>();
        int totalLen = N;

        for (int i = K; i >= 1; i--) {
            for (int len = A; len <= B; len++) {
                if (totalLen - len < 0) {
                    break;
                }
                if (i == 1) {
                    lines.add(str.substring(0, totalLen));
                    break;
                } else {
                    if (dp[totalLen - len][i - 1]) {
                        String line = str.substring(totalLen - len, totalLen);
                        lines.add(line);
                        totalLen -= len;
                        break;
                    }
                }
            }
        }
        Collections.reverse(lines);
        return joinValues(lines, "\n");
    }

    private static int[] readInts(Scanner sc, int N) {
        int[] arr = new int[N];
        for (int i = 0; i < N; i++) {
            arr[i] = sc.nextInt();
        }
        return arr;
    }

    private static String joinValues(List<? extends Object> list, String delim) {
        return list.stream().map(Object::toString).collect(Collectors.joining(delim));
    }

    public static void printDebug(Object str) {
        if (debug) {
            System.out.println("DEBUG: " + str);
        }
    }

    public static void main(String[] args) throws Exception {
        if (debug) {
            solveProblem(new FileInputStream(new File("input.in")));
        } else {
            solveProblem(System.in);
        }
    }

}
