#include <iostream>
#include <vector>
#include <string>

using namespace std;

// Опростена версия: взимаме блокове от 10 и намираме ръчно най-дългата обща подредица вътре.
void solve_tech1(int n, const string& s) {
    vector<int> f1, f2;
    int block_size = 10; 
    
    for (int i = 0; i + block_size <= n; i += block_size) {
        // Търсим оптималното разделяне в s[i ... i+block_size-1]
        // За целите на примера ползваме проста евристика или изчерпателно търсене (bitmask)
        int best_len = 0;
        vector<int> best_mask1, best_mask2;
        
        for(int mask = 0; mask < (1 << block_size); ++mask) {
            string s1 = "", s2 = "";
            vector<int> idx1, idx2;
            for(int b = 0; b < block_size; ++b) {
                if(mask & (1 << b)) { s1 += s[i+b]; idx1.push_back(i+b); }
                else { s2 += s[i+b]; idx2.push_back(i+b); }
            }
            // Търсим съвпадение (LCS) между s1 и s2. 
            // Тук е имплементирано опростено съвпадение на префиксите:
            int match_len = 0;
            while(match_len < s1.size() && match_len < s2.size() && s1[match_len] == s2[match_len]) {
                match_len++;
            }
            if(match_len > best_len) {
                best_len = match_len;
                best_mask1 = vector<int>(idx1.begin(), idx1.begin() + match_len);
                best_mask2 = vector<int>(idx2.begin(), idx2.begin() + match_len);
            }
        }
        for(int x : best_mask1) f1.push_back(x);
        for(int x : best_mask2) f2.push_back(x);
    }
    
    int k = f1.size();
    cout << k << "\n";
    for(int x : f1) cout << x << " "; cout << "\n";
    for(int x : f2) cout << x << " "; cout << "\n";
}

int main(){
	int n, g; cin >> n >> g;
	string s; cin >> s;
	solve_tech1(n, s);
}
