#include <bits/stdc++.h>   using namespace std;   const int INF = 1000000000;   const int prime = 9241;   const long double pi = acos(-1.);   int in[100005];   int masks[1000005];   bool used[1 << 22];   int main() {     int n, m, d;     scanf( %d%d%d , &n, &m, &d);     for (int i = 0; i < m; i++) {       int s;       scanf( %d , &s);       for (int j = 0; j < s; j++) {         int a;         scanf( %d , &a);         a--;         in[a] = i;       }     }     int cur[25] = {};     for (int i = 0; i < m; i++) cur[i] = 0;     for (int i = 0; i < d; i++) cur[in[i]]++;     int mcnt = 0;     masks[0] = 0;     for (int i = 0; i < m; i++)       if (cur[i] > 0) masks[0] |= 1 << i;     mcnt++;     for (int i = d; i < n; i++) {       cur[in[i - d]]--;       cur[in[i]]++;       masks[mcnt] = 0;       for (int j = 0; j < m; j++)         if (cur[j] > 0) masks[mcnt] |= 1 << j;       mcnt++;     }     queue<int> q;     for (int i = 0; i < (1 << m); i++) used[i] = 0;     for (int i = 0; i < mcnt; i++) {       q.push(masks[i]);       used[masks[i]] = 1;     }     while (!q.empty()) {       int cur = q.front();       q.pop();       for (int i = 0; i < m; i++) {         if (cur & (1 << i)) continue;         int nw = cur | (1 << i);         if (!used[nw]) {           used[nw] = 1;           q.push(nw);         }       }     }     int ans = 1000;     for (int i = 0; i < (1 << m); i++)       if (!used[i]) ans = min(ans, m - __builtin_popcount(i));     cout << ans << endl;     return 0;   }   