Problem: The Looksery company, consisting of n staff members, is planning another big party. Every employee has his phone number and the phone numbers of his friends in the phone book. Everyone who comes to the party, sends messages to his contacts about how cool it is. At the same time everyone is trying to spend as much time on the fun as possible, so they send messages to everyone without special thinking, moreover, each person even sends a message to himself or herself.

Igor and Max, Looksery developers, started a dispute on how many messages each person gets. Igor indicates n numbers, the i-th of which indicates how many messages, in his view, the i-th employee is going to take. If Igor guesses correctly at least one of these numbers, he wins, otherwise Max wins.

You support Max in this debate, so you need, given the contact lists of the employees, to determine whether there is a situation where Igor loses. Specifically, you need to determine which employees should come to the party, and which should not, so after all the visitors send messages to their contacts, each employee received a number of messages that is different from what Igor stated.

Input

The first line contains a single integer n (1 ≤ n ≤ 100) — the number of employees of company Looksery.

Next n lines contain the description of the contact lists of the employees. The i-th of these lines contains a string of length n, consisting of digits zero and one, specifying the contact list of the i-th employee. If the j-th character of the i-th string equals 1, then the j-th employee is in the i-th employee's contact list, otherwise he isn't. It is guaranteed that the i-th character of the i-th line is always equal to 1.

The last line contains n space-separated integers: a1, a2, ..., an (0 ≤ ai ≤ n), where ai represents the number of messages that the i-th employee should get according to Igor.

Output

In the first line print a single integer m — the number of employees who should come to the party so that Igor loses the dispute.

In the second line print m space-separated integers — the numbers of these employees in an arbitrary order.

If Igor wins the dispute in any case, print -1.

If there are multiple possible solutions, print any of them.

Examples

Input

3
101
010
001
0 1 2


Output

1
1 


Input

1
1
1


Output

0



Input

4
1111
0101
1110
0001
1 0 1 0


Output

4
1 2 3 4 

Note

In the first sample Igor supposes that the first employee will receive 0 messages. Since he isn't contained in any other contact list he must come to the party in order to receive one message from himself. If he is the only who come to the party then he will receive 1 message, the second employee will receive 0 messages and the third will also receive 1 message. Thereby Igor won't guess any number.

In the second sample if the single employee comes to the party he receives 1 message and Igor wins, so he shouldn't do it.

In the third sample the first employee will receive 2 messages, the second — 3, the third — 2, the fourth — 3.

Solution (in JAVA):

Solution:

import static java.util.Arrays.deepToString;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;

public class B {
    private static final boolean isDebug = false;
    int N;
    char[][] map;
    
    int[] guess;
    
    void solve() throws Throwable {
        N = readInt();
        map = readCharMatrix(N);
        guess = readIntArray();
        
        boolean[] includs = new boolean[N];
        Arrays.fill(includs, true);
        dfs(includs);
        
        System.out.println("-1");
    }
    
    Set<String> used = new HashSet<String>();
    
    int[] getSums(boolean[] includings) {
        int[] sums = new int[N];
        
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                if(!includings[j]) continue;
                if(map[j][i] == '1') {
                    sums[i]++;
                }
            }
        }
        return sums;
    }
    
    void dfs( boolean[] includes) {
        int[] sums = getSums(includes);
        for(int i = 0; i < N; i++) {
            if(sums[i] == guess[i]) {
                boolean[] next = Arrays.copyOf(includes, N);
                next[i] = false;
                dfs(next);
                return;
            }
        }
        int sum = 0;
        for(int i = 0 ; i < N; i++) {
            if(includes[i]) sum++;
        }
        System.out.println(sum);
        boolean isF = true;
        for(int i = 0 ; i < N; i++) {
            if(includes[i]) {
                if(!isF) {
                   System.out.print(" ");
                }
                isF = false;
                System.out.print(i+1);
            }
        }
        System.exit(0);
    }

    private static long gcd(long n1, long n2) {
        return (n2 == 0)?n1:gcd(n2, n1%n2);
    }

    private static int gcd(int n1, int n2) {
        return (n2 == 0)?n1:gcd(n2, n1%n2);
    }

    static long startTime;
    public static void main(String[] args) {
        B app = new B();
        try {
            app.br = new BufferedReader(new InputStreamReader(System.in));
            app.solve();
        } catch(Throwable e) {
            e.printStackTrace();
        } finally {
            try { app.br.close();} catch (Exception igunore) {}
        }
        d(System.currentTimeMillis() - startTime + " ms");
        pw.flush();
        pw.close();
    }

    static final void d(Object ... o) {
        if (isDebug) pw.println(deepToString(o));
    }

    void permutationAll(int[] p) {
        permutation(p, 0, p.length - 1);
    }

    void permutationRange(int from, int to) {
        int cnt = to - from + 1;
        int[] elements = new int[cnt];
        for (int i = 0 ; i <  cnt; i++) elements[i] = from++;
        permutation(elements, 0, cnt - 1);
    }

    void permutation(int[] elements, int nowCnt, int totalCnt) {
        if (nowCnt == totalCnt) { 
            // TODO insertCode
        } else {

            for (int i = nowCnt; i <= totalCnt; i++) {
                int tmp = elements[nowCnt]; 
                elements[nowCnt] = elements[i]; 
                elements[i] = tmp;
                permutation(elements, nowCnt+1, totalCnt);
                tmp = elements[nowCnt]; 
                elements[nowCnt] = elements[i]; 
                elements[i] = tmp;
            }
        }
    }

    static PrintWriter pw = new PrintWriter(System.out);

    private BufferedReader br = null;
    private StringTokenizer st = null;
    private String delimiter = null;
    
    public String next() {
        while (st == null || !st.hasMoreTokens()) {
            if(delimiter != null) {
                st = new StringTokenizer(readLine(), delimiter);
            } else {
                st = new StringTokenizer(readLine());
            }
        }
        return st.nextToken();
    }

    public void close() {
        try {
            this.br.close();
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public final String readString() {
        return next();
    }
    public final int readInt()  {
        return Integer.parseInt(next());
    }
    public final long readLong()  {
        return Long.parseLong(next());
    }
    public final double readDouble()  {
        return Double.parseDouble(next());
    }

    public final int[] readIntArray()  {
        String[] s = readStrArray();
        int cnt = s.length;
        int[] out = new int[cnt];
        for (int i = 0; i < cnt; i++) out[i] = Integer.parseInt(s[i]);
        return out;
    }
    public final long[] readLongArray()  {
        String[] s = readStrArray();
        int cnt = s.length;
        long[] out = new long[cnt];
        for (int i = 0; i < cnt; i++) out[i] = Long.parseLong(s[i]);
        return out;
    }

    public final int[] readIntColumnArray(int N)  {
        int[] res = new int[N];
        for (int i = 0; i < N; i++) {
            res[i] = readInt();
        } 
        return res;
    }
    
    public final int[][] readIntMatrix(int N) {
        int[][] res = new int[N][];
        for (int i = 0; i < N; i++) {
            res[i] = readIntArray();
        }
        return res;
    }
    
    public final char[][] readCharMatrix(int N) {
        char[][] res = new char[N][];
        for (int i = 0; i < N; i++) {
            res[i] = readCharArray();
        }
        return res;
    }

    public final char[] readCharArray()  {
        String[] s = readStrArray();
        int cnt = s.length;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < cnt; i++) sb.append(s[i]);
        return sb.toString().toCharArray();
    }
    

    public final String[] readStrArray()  {
      List<String> res = new ArrayList<String>();
      StringTokenizer st = new StringTokenizer(readLine(), " ");
      while (st.hasMoreTokens()) {
          res.add(st.nextToken());
      }
      return res.toArray(new String[0]);
    }

    public void setDelimiter(String delim) {
        this.delimiter = delim;
    }
    
    public String getDelimiter() {
        return this.delimiter;
    }

    private String readLine() {
        try {
            return br.readLine();
        } catch(IOException ioe) {
            ioe.printStackTrace();
            throw new RuntimeException(ioe);
        }
    }
}