#include <bits/stdc++.h>   #pragma GCC optimize( O3 )   #pragma GCC target( avx2,avx )   #pragma GCC optimize( unroll-loops )   using namespace std;   string YES[2] = { NO ,  YES };   string Yes[2] = { No ,  Yes };   string yes[2] = { no ,  yes };   template <class T>   using pq = priority_queue<T>;   template <class T>   using pqg = priority_queue<T, vector<T>, greater<T>>;   int scan() { return getchar(); }   void scan(int &a) { cin >> a; }   void scan(long long &a) { cin >> a; }   void scan(char &a) { cin >> a; }   void scan(double &a) { cin >> a; }   void scan(string &a) { cin >> a; }   template <class T, class S>   void scan(pair<T, S> &p) {     scan(p.first), scan(p.second);   }   template <class T>   void scan(vector<T> &);   template <class T>   void scan(vector<T> &a) {     for (auto &i : a) scan(i);   }   template <class T>   void scan(T &a) {     cin >> a;   }   void IN() {}   template <class Head, class... Tail>   void IN(Head &head, Tail &...tail) {     scan(head);     IN(tail...);   }   template <class T, class S>   inline bool chmax(T &a, S b) {     if (a < b) {       a = b;       return 1;     }     return 0;   }   template <class T, class S>   inline bool chmin(T &a, S b) {     if (a > b) {       a = b;       return 1;     }     return 0;   }   vector<int> iota(int n) {     vector<int> a(n);     iota(begin(a), end(a), 0);     return a;   }   template <typename T>   vector<int> iota(vector<T> &a, bool greater = false) {     vector<int> res(a.size());     iota(begin(res), end(res), 0);     sort(begin(res), end(res), [&](int i, int j) {       if (greater) return a[i] > a[j];       return a[i] < a[j];     });     return res;   }   vector<pair<long long, long long>> factor(long long x) {     vector<pair<long long, long long>> ans;     for (long long i = 2; i * i <= x; i++)       if (x % i == 0) {         ans.push_back({i, 1});         while ((x /= i) % i == 0) ans.back().second++;       }     if (x != 1) ans.push_back({x, 1});     return ans;   }   template <class T>   vector<T> divisor(T x) {     vector<T> ans;     for (T i = 1; i * i <= x; i++)       if (x % i == 0) {         ans.push_back(i);         if (i * i != x) ans.push_back(x / i);       }     return ans;   }   template <typename T>   void zip(vector<T> &x) {     vector<T> y = x;     sort(begin(y), end(y));     for (int i = 0; i < x.size(); ++i) {       x[i] = distance((y).begin(), lower_bound(begin(y), end(y), (x[i])));     }   }   int popcount(long long x) { return __builtin_popcountll(x); }   struct Setup_io {     Setup_io() {       ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);       cout << fixed << setprecision(15);     }   } setup_io;   int in() {     int x;     cin >> x;     return x;   }   long long lin() {     unsigned long long x;     cin >> x;     return x;   }   template <typename T>   struct edge {     int from, to;     T cost;     int id;     edge(int to, T cost) : from(-1), to(to), cost(cost) {}     edge(int from, int to, T cost) : from(from), to(to), cost(cost) {}     edge(int from, int to, T cost, int id)         : from(from), to(to), cost(cost), id(id) {}     edge &operator=(const int &x) {       to = x;       return *this;     }     operator int() const { return to; }   };   template <typename T>   using Edges = vector<edge<T>>;   using Tree = vector<vector<int>>;   using Graph = vector<vector<int>>;   template <class T>   using Wgraph = vector<vector<edge<T>>>;   Graph getG(int n, int m = -1, bool directed = false, int margin = 1) {     Tree res(n);     if (m == -1) m = n - 1;     while (m--) {       int a, b;       cin >> a >> b;       a -= margin, b -= margin;       res[a].emplace_back(b);       if (!directed) res[b].emplace_back(a);     }     return move(res);   }   template <class T>   Wgraph<T> getWg(int n, int m = -1, bool directed = false, int margin = 1) {     Wgraph<T> res(n);     if (m == -1) m = n - 1;     while (m--) {       int a, b;       T c;       cin >> a >> b >> c;       a -= margin, b -= margin;       res[a].emplace_back(b, c);       if (!directed) res[b].emplace_back(a, c);     }     return move(res);   }   template <class T>   ostream &operator<<(ostream &os, const vector<T> &v) {     for (auto &e : v) cout << e <<    ;     cout << endl;     return os;   }   template <class T, class S>   ostream &operator<<(ostream &os, const pair<T, S> &p) {     cout <<  (  << p.first <<  ,   << p.second <<  ) ;     return os;   }   template <class S, class T>   string to_string(pair<S, T> p) {     return  (  + to_string(p.first) +  ,  + to_string(p.second) +  ) ;   }   template <class A>   string to_string(A v) {     if (v.empty()) return  {} ;     string ret =  { ;     for (auto &x : v) ret += to_string(x) +  , ;     ret.back() =  } ;     return ret;   }   void dump() { cerr << endl; }   template <class Head, class... Tail>   void dump(Head head, Tail... tail) {     cerr << to_string(head) <<    ;     dump(tail...);   }   template <typename T>   static constexpr T inf = numeric_limits<T>::max() / 2;   int main() {     int n, k;     IN(n, k);     int ans = 0;     while (k--) {       int m;       IN(m);       vector<int> a(m);       IN(a);       if (a[0] == 1) {         int c = 0;         while (c < m and a[c] == c + 1) c++;         ans += m - c;         ans += m - c;       } else         ans += m * 2 - 1;     }     cout << ans <<   n ;   }