
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[] time;
static int[] isVisited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
time = new int[100001];
isVisited = new int[100001];
if (N == K) {
System.out.println(0);
System.out.println(N);
return;
}
bfs(N, K);
StringBuilder sb = new StringBuilder();
sb.append(time[K] - 1).append("\n");
int idx = K;
LinkedList<Integer> path = new LinkedList<>();
while (idx != -1) {
path.addFirst(idx);
idx = isVisited[idx];
}
for (int loc : path) {
sb.append(loc).append(" ");
}
System.out.println(sb.toString().trim());
}
static void bfs(int start, int target) {
Queue<Integer> q = new LinkedList<>();
q.add(start);
time[start] = 1;
isVisited[start] = -1;
while (!q.isEmpty()) {
int loc = q.poll();
for (int i = 0; i < 3; i++) {
int next;
if (i == 0) next = loc + 1;
else if (i == 1) next = loc - 1;
else next = loc * 2;
if (next < 0 || next > 100000 || time[next] != 0) continue;
q.add(next);
time[next] = time[loc] + 1;
isVisited[next] = loc;
if (next == target) return;
}
}
}