#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
using ll = long long;

struct Node {
    int val, i, j;
    Node() : val(0), i(0), j(0) {}
    Node(int i, int j) : val(0), i(i), j(j) {}
    Node(int& val, int i, int& j) : val(val), i(i), j(j) {};
};

int main() {
    int n, m; cin >> n >> m;
    vector <int> w(n), c(n);
    for (int i = 0; i < n; i++) {
        cin >> w[i];
    }
    for (int i = 0; i < n; i++) {
        cin >> c[i];
    }
    vector <vector<Node>> dp(n, vector<Node>(m + 1));
    for (int i = 0; i < n; i++) {
        dp[i][0] = Node(i, 0);
    }
    for (int j = 1; j <= m; j++) {
        dp[0][j] = Node(0, j);
    }
    for (int i = 1; i < n; i++) {
        for (int j = 1; j <= m; j++) {
            int buf = dp[i - 1][j].val, jj = j;
            if (j - w[i] >= 0 and dp[i - 1][j - w[i]].val + c[i] >= buf) {
                buf = dp[i - 1][j - w[i]].val + c[i];
                jj = j - w[i];
            }
            dp[i][j] = Node(buf, i - 1, jj);
        }
    }
    vector <int> path;
    int i = n - 1, j = m;
    while (i > 0 and j > 0) {
        Node buf = dp[i][j];
        if (buf.i == i - 1 and buf.j != j) {
            path.push_back(i + 1);
            j = buf.j;
        }
        i = buf.i;
    }

    reverse(path.begin(), path.end());
    cout << path.size() << endl;
    for (auto c : path) {
        cout << c << ' ';
    }
    return 0;
}

//отправляю, чтобы сохранить