#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
long long n, m, q, wi, wx;
long long w[10][10];
struct node {
  long long x[10];
  node *L, *R;
  node() {
    L = R = NULL;
    for (int i = 0; i < 3; i++) x[i + i * 3] = 1;
  }
  void updt() {
    if (!L) L = new node();
    if (!R) R = new node();
    for (int i = 0; i < 9; i++) x[i] = 0;
    for (int i = 0; i < 9; i++) {
      for (int j = 0; j < 9; j++) {
        long long a, b, c, d;
        a = i / 3;
        b = i - 3 * a;
        c = j / 3;
        d = j - 3 * c;
        if (w[b][c]) {
          x[a * 3 + d] = (x[a * 3 + d] + L->x[i] * R->x[j]);
          if (x[a * 3 + d] >= 777777777) x[a * 3 + d] %= 777777777;
        }
      }
    }
  }
};
void updt(long long l, long long r, node *&x) {
  if (wi < l || r - 1 < wi) return;
  if (!x) x = new node();
  if (l == r - 1) {
    for (int i = 0; i < 9; i++) x->x[i] = 0;
    if (wx != -1)
      x->x[wx * 3 + wx] = 1;
    else
      for (int i = 0; i < 3; i++) x->x[i * 3 + i] = 1;
    return;
  }
  updt(l, (l + r) / 2, x->L);
  updt((l + r) / 2, r, x->R);
  x->updt();
}
node *root = NULL;
int main() {
  ios::sync_with_stdio(0);
  cin >> n >> q;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) cin >> w[i][j];
  for (int i = 1; i <= n; i++) {
    wi = i;
    wx = -1;
    updt(1, n + 1, root);
  }
  while (q--) {
    cin >> wi >> wx;
    wx--;
    updt(1, n + 1, root);
    long long pas = 0;
    for (int i = 0; i < 9; i++) pas += root->x[i];
    cout << pas % 777777777 << endl;
  }
}
