#include <bits/stdc++.h>   using namespace std;   int shortestPaths[100][100];   int graph[100][100];   void bfs(int start, int n) {     queue<int> q;     q.push(start);     int visited[n];     for (int i = 0; i < n; i++) {       visited[i] = 0;     }     visited[start] = 1;     int dist = 1;     while (true) {       int sz = q.size();       if (sz == 0) {         break;       }       for (int i = 0; i < sz; i++) {         int cur = q.front();         q.pop();         for (int j = 0; j < 100; j++) {           if (graph[cur][j] == 1 && visited[j] == 0) {             visited[j] = 1;             shortestPaths[start][j] = dist;             q.push(j);           }         }       }       dist++;     }   }   int main() {     ios_base::sync_with_stdio(false);     int n;     cin >> n;     for (int i = 0; i < 100; i++) {       for (int j = 0; j < 100; j++) {         shortestPaths[i][j] = 0;         graph[i][j] = 0;       }     }     for (int i = 0; i < n; i++) {       string s;       cin >> s;       for (int j = 0; j < n; j++) {         graph[i][j] = (int)(s[j] -  0 );       }     }     int m;     cin >> m;     vector<int> vertices;     for (int i = 0; i < m; i++) {       int a;       cin >> a;       a--;       vertices.push_back(a);     }     for (int i = 0; i < n; i++) {       bfs(i, n);     }     vector<int> result;     result.push_back(vertices[0]);     int last = vertices[0];     int ind = 0;     for (int i = 1; i < m; i++) {       if (i != 1) {         if (shortestPaths[last][vertices[i]] < i - ind) {           result.push_back(vertices[i - 1]);           ind = i - 1;           last = vertices[i - 1];         }       }     }     result.push_back(vertices[vertices.size() - 1]);     cout << result.size() << endl;     for (int i = 0; i < result.size(); i++) {       cout << result[i] + 1 <<    ;     }     return 0;   }   