func_code_string: #include <bits/stdc++.h>   using namespace std;   const int maxn = 100009;   int first[maxn], du[maxn], pre[maxn][2];   struct edg {     int next, to;   } e[maxn << 1];   struct node {     int x, opt;   };   bool vis[maxn][2], ins[maxn], ok[maxn];   queue<node> q;   int n, m, s, e_sum;   bool flag;   inline int read() {     int x = 0, f = 1;     char ch = getchar();     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) {       x = x * 10 + ch -  0 ;       ch = getchar();     }     return x * f;   }   void add_edg(int x, int y) {     e_sum++;     e[e_sum].next = first[x];     first[x] = e_sum;     e[e_sum].to = y;   }   void print(int x, int opt) {     if (x == s && opt == 0) {       printf( %d  , x);       return;     }     print(pre[x][opt], opt ^ 1);     printf( %d  , x);   }   void dfs(int x) {     ok[x] = ins[x] = 1;     for (int i = first[x]; i; i = e[i].next) {       int w = e[i].to;       if (ins[w]) flag = 1;       if (!ok[w]) dfs(w);     }     ins[x] = 0;   }   int main() {     n = read();     m = read();     for (int i = 1; i <= n; i++) {       du[i] = read();       for (int j = 1; j <= du[i]; j++) {         int x = read();         add_edg(i, x);       }     }     s = read();     q.push((node){s, 0});     vis[s][0] = 1;     while (!q.empty()) {       int x = q.front().x, opt = q.front().opt;       q.pop();       for (int i = first[x]; i; i = e[i].next) {         int w = e[i].to;         if (!vis[w][opt ^ 1]) {           vis[w][opt ^ 1] = 1;           pre[w][opt ^ 1] = x;           q.push((node){w, opt ^ 1});         }       }     }     for (int i = 1; i <= n; i++)       if (du[i] == 0 && vis[i][1]) {         puts( Win );         print(i, 1);         return 0;       }     dfs(s);     if (flag)       puts( Draw );     else       puts( Lose );     return 0;   }   