#include <bits/stdc++.h>
using namespace std;
const int MOD = 777777777;
const int N = 100000;
int n, m;
int val[4][4];
struct T {
  int f[4][4];
  void update(T *l, T *r) {
    memset(f, 0, sizeof f);
    for (int i1 = (1); i1 <= (3); i1++)
      for (int j0 = (1); j0 <= (3); j0++)
        if (val[i1][j0])
          for (int i0 = (1); i0 <= (3); i0++)
            for (int j1 = (1); j1 <= (3); j1++)
              f[i0][j1] =
                  (f[i0][j1] + (long long)l->f[i0][i1] * r->f[j0][j1]) % MOD;
  }
  void setit(int v) {
    memset(f, 0, sizeof f);
    for (int i = (1); i <= (3); i++)
      if (!v || i == v) f[i][i] = 1;
  }
  int sum() {
    int ret = 0;
    for (int i = (1); i <= (3); i++)
      for (int j = (1); j <= (3); j++) ret = (ret + f[i][j]) % MOD;
    return ret;
  }
} t[N * 4];
void modify(int x, int sl, int sr, int pos, int v) {
  if (sl == sr) {
    t[x].setit(v);
    return;
  }
  int smid = (sl + sr) / 2;
  if (pos <= smid)
    modify(2 * x, sl, smid, pos, v);
  else
    modify(2 * x + 1, smid + 1, sr, pos, v);
  t[x].update(t + 2 * x, t + 2 * x + 1);
}
void build(int x, int l, int r) {
  if (l == r) {
    t[x].setit(0);
    return;
  }
  build(2 * x, l, (l + r) / 2);
  build(2 * x + 1, (l + r) / 2 + 1, r);
  t[x].update(t + 2 * x, t + 2 * x + 1);
}
int main() {
  cin >> n >> m;
  for (int i = (1); i <= (3); i++)
    for (int j = (1); j <= (3); j++) cin >> val[i][j];
  build(1, 1, n);
  while (m--) {
    int x, v;
    scanf("%d%d", &x, &v);
    modify(1, 1, n, x, v);
    cout << t[1].sum() << endl;
  }
  return 0;
}
