#include <bits/stdc++.h>
using namespace std;
int w[5][5];
const int mod = 777777777;
int dp[300010][4][4];
void pushup(int rt) {
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) {
      dp[rt][i][j] = 0;
      for (int k = 0; k < 3; k++)
        for (int l = 0; l < 3; l++) {
          if (!w[k][l]) continue;
          dp[rt][i][j] =
              (dp[rt][i][j] + 1ll * dp[rt << 1][i][k] * dp[rt << 1 | 1][l][j]) %
              mod;
        }
    }
}
void build(int l, int r, int rt) {
  if (l > r) return;
  if (l == r) {
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) dp[rt][i][j] = 0;
    for (int i = 0; i < 3; i++) dp[rt][i][i] = 1;
    return;
  }
  int m = (l + r) >> 1;
  build(l, m, rt << 1);
  build(m + 1, r, rt << 1 | 1);
  pushup(rt);
}
void update(int p, int add, int l, int r, int rt) {
  if (l > r) return;
  if (l == r) {
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) dp[rt][i][j] = 0;
    if (!add) {
      for (int j = 0; j < 3; j++) dp[rt][j][j] = 1;
    } else
      dp[rt][add - 1][add - 1] = 1;
    return;
  }
  int m = (l + r) >> 1;
  if (p <= m)
    update(p, add, l, m, rt << 1);
  else
    update(p, add, m + 1, r, rt << 1 | 1);
  pushup(rt);
}
int main() {
  int T, n, m;
  ios::sync_with_stdio(false);
  cin >> n >> m;
  for (int i = 0; i < 3; i++)
    for (int j = 0; j < 3; j++) {
      cin >> w[i][j];
    }
  build(1, n, 1);
  while (m--) {
    int a, b;
    cin >> a >> b;
    update(a, b, 1, n, 1);
    int ans = 0;
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) ans = (ans + 1ll * dp[1][i][j]) % mod;
    cout << ans << endl;
  }
  return 0;
}
