#include <bits/stdc++.h>
int poz, val;
int m[3][3];
int aint[265000][3][3];
void add(int &x, int y) {
  x += y;
  if (x >= 777777777) x -= 777777777;
}
void unite(int n[3][3], int st[3][3], int dr[3][3]) {
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) n[i][j] = 0;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++)
      if (m[i][j])
        for (int p = 0; p < 3; p++)
          for (int q = 0; q < 3; q++)
            add(n[p][q], 1LL * st[p][i] * dr[j][q] % 777777777);
}
void dfs(int p, int st, int dr) {
  if (st == dr)
    aint[p][1][1] = aint[p][2][2] = aint[p][0][0] = 1;
  else {
    int m = (st + dr) / 2;
    dfs(2 * p, st, m);
    dfs(2 * p + 1, m + 1, dr);
    unite(aint[p], aint[2 * p], aint[2 * p + 1]);
  }
}
void update(int p, int st, int dr) {
  if (st == dr) {
    if (val == 0)
      aint[p][1][1] = aint[p][2][2] = aint[p][0][0] = 1;
    else {
      aint[p][1][1] = aint[p][2][2] = aint[p][0][0] = 0;
      aint[p][val - 1][val - 1] = 1;
    }
  } else {
    int m = (st + dr) / 2;
    if (poz <= m)
      update(2 * p, st, m);
    else
      update(2 * p + 1, m + 1, dr);
    unite(aint[p], aint[2 * p], aint[2 * p + 1]);
  }
}
int main() {
  int n, q;
  scanf("%d%d", &n, &q);
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) scanf("%d", &m[i][j]);
  dfs(1, 1, n);
  int x, y;
  for (int i = 1; i <= q; i++) {
    scanf("%d%d", &x, &y);
    poz = x;
    val = y;
    update(1, 1, n);
    int ans = 0;
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) add(ans, aint[1][i][j]);
    printf("%d\n", ans);
  }
  return 0;
}
