func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:267386880 )   using namespace std;   int n;   char g[72][72];   struct pos {     int data[3];   };   const int MAXQ = 400000;   bool used[72][72][72];   pos prv[72][72][72];   pos q[MAXQ];   int head, tail;   pair<int, int> getDiff(pos &a, pos &b) {     int diffA(-1);     for (int i(0); i <= ((long long)(3) - 1); ++i) {       bool ok(true);       for (int j(0); j <= ((long long)(3) - 1); ++j)         if (b.data[j] == a.data[i]) ok = false;       if (ok) {         diffA = a.data[i];         break;       }     }     int sm1(accumulate(a.data, a.data + 3, 0));     int sm2(accumulate(b.data, b.data + 3, 0));     int diffB = -(sm1 - sm2 - diffA);     return make_pair(diffA, diffB);   }   void printAns() {     pos tmp = {{0, 1, 2}};     pos &now = tmp;     pos &from = prv[0][1][2];     vector<pair<int, int> > ans;     while (from.data[0] != -1) {       pair<int, int> rs(getDiff(from, now));       ans.push_back(rs);       now = from;       from = prv[now.data[0]][now.data[1]][now.data[2]];     }     reverse((ans).begin(), (ans).end());     printf( %d n , ((int)ans.size()));     for (int i(0); i <= ((long long)(((int)ans.size())) - 1); ++i)       printf( %d %d n , ans[i].first + 1, ans[i].second + 1);     exit(0);   }   void addPos(int a, int b, int c, pos from) {     pos p = {{a, b, c}};     sort(p.data, p.data + 3);     if (used[p.data[0]][p.data[1]][p.data[2]]) return;     used[p.data[0]][p.data[1]][p.data[2]] = true;     prv[p.data[0]][p.data[1]][p.data[2]] = from;     q[tail++] = p;     if (tail == MAXQ) tail = 0;     if (p.data[0] == 0 && p.data[1] == 1 && p.data[2] == 2) printAns();   }   bool can(int from, int to, int a, int b) { return g[a][b] == g[from][to]; }   void process() {     pos &cur = q[head++];     if (head == MAXQ) head = 0;     for (int i(0); i <= ((long long)(3) - 1); ++i) {       int from(cur.data[i]);       int a(cur.data[(i + 1) % 3]), b(cur.data[(i + 2) % 3]);       for (int to(0); to <= ((long long)(n)-1); ++to) {         if (to == a || to == b || to == from) continue;         if (can(from, to, a, b)) addPos(to, a, b, cur);       }     }   }   void solve() {     scanf( %d , &n);     int a, b, c;     scanf( %d%d%d n , &a, &b, &c);     for (int i(0); i <= ((long long)(n)-1); ++i) gets(g[i]);     pos fict = {{-1, -1, -1}};     addPos(--a, --b, --c, fict);     while (head != tail) process();     printf( -1 n );   }   void bruteforce() {}   int main() {     solve();     bruteforce();     return 0;   }   