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

using namespace std;

// Структура, която пази оптималното разделяне за даден префикс
struct PrefixSplit {
    int length;          // Дължина на консумирания префикс
    vector<int> f1_idx;  // Индекси за първата ограда (спрямо началото на префикса)
    vector<int> f2_idx;  // Индекси за втората ограда
};

void solve_tech2(int n, const string& s) {
    // Речник с оптималните идентични поднизове за всеки префикс, посочен в анализа.
    // Търсим възможно най-дългите два еднакви непресичащи се подниза във всеки блок.
    map<string, PrefixSplit> splits = {
        {"00",    {2, {0}, {1}}},          // Съвпадение: "0" и "0"
        {"0101",  {4, {0, 1}, {2, 3}}},    // Съвпадение: "01" и "01"
        {"01000", {5, {0, 2}, {3, 4}}},    // Съвпадение: "00" и "00"
        {"01001", {5, {0, 1}, {2, 4}}},    // Съвпадение: "01" и "01"
        {"01100", {5, {1, 3}, {2, 4}}},    // Съвпадение: "10" и "10"
        {"01101", {5, {0, 1}, {3, 4}}},    // Съвпадение: "01" и "01"
        {"01110", {5, {1}, {2}}},          // Съвпадение: "1" и "1" (тук няма съвпадение с дължина 2)
        {"01111", {5, {1, 2}, {3, 4}}}     // Съвпадение: "11" и "11"
    };

    vector<int> fence1, fence2;
    int i = 0;

    while (i < n) {
        // Взимаме следващите до 5 символа, за да проверим префиксите
        string current_prefix = "";
        for (int j = 0; j < 5 && i + j < n; ++j) {
            // Нормализация: ако низът започва с '1', обръщаме всички битове,
            // за да ползваме същия речник, който е базиран на '0'.
            if (s[i] == '1') {
                current_prefix += (s[i + j] == '1' ? '0' : '1');
            } else {
                current_prefix += s[i + j];
            }
        }

        bool matched = false;
        // Търсим кой от шаблоните в речника е префикс на текущия низ
        for (const auto& pair : splits) {
            const string& key = pair.first;
            const PrefixSplit& split = pair.second;

            if (current_prefix.size() >= key.size() && 
                current_prefix.substr(0, key.size()) == key) {
                
                // Намерихме съвпадение! Добавяме съответните индекси
                for (int idx : split.f1_idx) fence1.push_back(i + idx);
                for (int idx : split.f2_idx) fence2.push_back(i + idx);
                
                i += split.length; // Преместваме се напред с дължината на префикса
                matched = true;
                break;
            }
        }

        // Ако остават броени символи до края на низа и не формират нито един цял префикс
        if (!matched) {
            i++; 
        }
    }

    // Принтиране на резултата във формата, изискван от условието
    int k = fence1.size();
    cout << k << "\n";
    for (int j = 0; j < k; ++j) cout << fence1[j] << (j == k - 1 ? "" : " ");
    cout << "\n";
    for (int j = 0; j < k; ++j) cout << fence2[j] << (j == k - 1 ? "" : " ");
    cout << "\n";
}

int main() {
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL);
    
    int n, g;
    if (cin >> n >> g) {
        string s;
        cin >> s;
        solve_tech2(n, s);
    }
    
    return 0;
}
