#include <bits/stdc++.h>
using namespace std;
const long long maxn = 210;
long long dp[maxn][maxn], dis[maxn][maxn];
long long t, h, r, n, m;
long long a[maxn], b[maxn], c[maxn], d[maxn];
struct node {
  long long t, h;
  bool operator==(const node v) const {
    return (this->t == v.t) && (this->h == v.h);
  }
  bool operator!=(const node v) const {
    return (this->t != v.t) || (this->h != v.h);
  }
  bool ok() const {
    return (this->t >= 0) && (this->h >= 0) && (this->t + this->h <= r);
  }
};
vector<node> adj[maxn][maxn];
long long mark[maxn][maxn];
void build(node u, node p = {-1, -1}) {
  if (!u.ok()) return;
  if (p.ok()) adj[p.t][p.h].push_back(u);
  if (mark[u.t][u.h]) return;
  mark[u.t][u.h] = 1;
  for (long long i = 1; i <= n; i++)
    if (u.t >= i) {
      node v = {u.t - i + a[i], u.h + b[i]};
      build(v, u);
    }
  for (long long i = 1; i <= m; i++)
    if (u.h >= i) {
      node v = {u.t + c[i], u.h - i + d[i]};
      build(v, u);
    }
}
void dfs(node u) {
  mark[u.t][u.h] = 1;
  for (node v : adj[u.t][u.h]) {
    if (!mark[v.t][v.h])
      dfs(v);
    else if (mark[v.t][v.h] == 1) {
      cout << "Draw";
      exit(0);
    }
    dp[u.t][u.h] = max(dp[u.t][u.h], dp[v.t][v.h] + 1);
  }
  mark[u.t][u.h] = 2;
}
void bfs(node u) {
  mark[u.t][u.h] = 1;
  dis[u.t][u.h] = 0;
  queue<node> q;
  q.push(u);
  while (!q.empty()) {
    node v = q.front();
    q.pop();
    for (node x : adj[v.t][v.h])
      if (!mark[x.t][x.h])
        dis[x.t][x.h] = dis[v.t][v.h] + 1, mark[x.t][x.h] = 1, q.push(x);
  }
}
signed main() {
  cin >> t >> h >> r;
  cin >> n;
  for (long long i = 1; i <= n; i++) cin >> a[i] >> b[i];
  cin >> m;
  for (long long i = 1; i <= m; i++) cin >> c[i] >> d[i];
  node s = {t, h}, f = {0, 0};
  build(s);
  memset(mark, 0, sizeof mark);
  bfs(s);
  if (mark[f.t][f.h]) return cout << "Ivan\n" << dis[f.t][f.h], 0;
  memset(mark, 0, sizeof mark);
  dfs(s);
  cout << "Zmey\n" << dp[t][h] + 1;
  return 0;
}
