#include <bits/stdc++.h>
using namespace std;
const int N = (int)1e5;
const int mod = 777777777;
int t[4 * N][3][3];
int a[N];
bool ok[3][3];
int n, m;
void add(int& x, int y) {
  x += y;
  x -= x >= mod ? mod : 0;
}
void merge(int l, int r, int to) {
  memset(t[to], 0, sizeof(t[to]));
  for (auto l1 = (0); l1 < (3); l1++)
    for (auto l2 = (0); l2 < (3); l2++)
      for (auto l3 = (0); l3 < (3); l3++)
        if (ok[l2][l3])
          for (auto l4 = (0); l4 < (3); l4++)
            add(t[to][l1][l4], t[l][l1][l2] * 1ll * t[r][l3][l4] % mod);
}
void build(int v, int l, int r) {
  if (l == r) {
    for (auto i = (0); i < (3); i++) t[v][i][i] = 1;
    return;
  }
  int mid = (l + r) / 2;
  build(2 * v, l, mid);
  build(2 * v + 1, mid + 1, r);
  merge(2 * v, 2 * v + 1, v);
}
void upd(int v, int l, int r, int pos, int val) {
  if (l == r) {
    a[l] = val;
    memset(t[v], 0, sizeof(t[v]));
    if (val)
      t[v][val - 1][val - 1] = 1;
    else
      for (auto i = (0); i < (3); i++) t[v][i][i] = 1;
    return;
  }
  int mid = (l + r) / 2;
  if (pos <= mid)
    upd(2 * v, l, mid, pos, val);
  else
    upd(2 * v + 1, mid + 1, r, pos, val);
  merge(2 * v, 2 * v + 1, v);
}
int get_ans() {
  int res = 0;
  for (auto i = (0); i < (3); i++)
    for (auto j = (0); j < (3); j++) add(res, t[1][i][j]);
  return res;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  scanf("%d%d", &n, &m);
  for (auto i = (0); i < (3); i++)
    for (auto j = (0); j < (3); j++) {
      int x;
      scanf("%d", &x);
      ok[i][j] = x;
    }
  memset(a, 0, sizeof(a));
  build(1, 0, n - 1);
  for (auto i = (0); i < (m); i++) {
    int pos, w;
    scanf("%d%d", &pos, &w);
    --pos;
    upd(1, 0, n - 1, pos, w);
    printf("%d\n", get_ans());
  }
  return 0;
}
