1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;

#ifdef LOCAL
ostream &operator<<(ostream &out, string str)
{
    for (char c : str)
        out << c;
    return out;
}
template <class L, class R>
ostream &operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.first << ", " << p.second << ")"; }
template <class L, class R, class S>
ostream &operator<<(ostream &out, tuple<L, R, S> p)
{
    auto &[a, b, c] = p;
    return out << "(" << a << ", " << b << ", " << c << ")";
}
template <class T>
auto operator<<(ostream &out, T a) -> decltype(a.begin(), out)
{
    out << '{';
    for (auto it = a.begin(); it != a.end(); it = next(it))
        out << (it != a.begin() ? ", " : "") << *it;
    return out << '}';
}
void dump() { cerr << "\n"; }
template <class T, class... Ts>
void dump(T a, Ts... x)
{
    cerr << a << ", ";
    dump(x...);
}
#define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__)
#else
#define debug(...) 42
#endif

const ll MOD = 1000000007;

ll pot(ll a, ll b = MOD - 2)
{
    if (!b)
        return 1;
    if (b & 1)
        return (a * pot(a, b - 1)) % MOD;
    ll temp = pot(a, b / 2);
    return (temp * temp) % MOD;
}

main()
{
    cin.tie(0)->sync_with_stdio(0);
    cin.exceptions(cin.failbit);

    int Z = 1;
    // cin >> Z;
    while (Z--)
    {
        int n, k;
        cin >> n >> k;
        vector<vi> G(k, vi(n)), vis(n, vi(n, 0));
        for (auto &a : G)
            for (auto &b : a)
            {
                cin >> b;
                --b;
            }
        pll curr;
        ll sum = 0;
        queue<pii> Q;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (i != j && !vis[i][j])
                {
                    vis[i][j] = 1;
                    Q.push({i, j});
                    curr = {0, 0};
                    while (Q.size())
                    {
                        if (Q.front().first < Q.front().second)
                            curr.first++;
                        else
                            curr.second++;
                        for (int l = 0; l < G.size(); l++)
                            if (!vis[G[l][Q.front().first]][G[l][Q.front().second]])
                            {
                                vis[G[l][Q.front().first]][G[l][Q.front().second]] = 1;
                                Q.push({G[l][Q.front().first], G[l][Q.front().second]});
                            }
                        Q.pop();
                    }
                    ll val = (curr.first * curr.second) % MOD;
                    val = (val * pot(curr.first + curr.second)) % MOD;
                    sum = (sum + val) % MOD;
                }
        cout << sum;
    }
}