#include <bits/stdc++.h>
using namespace std;
const int MAX = 1000, MAX2 = 40000;
int hh[MAX2][2], tt[MAX2][2], h, t, r, n, m;
struct s {
  int x, y, dis;
};
vector<s> ans;
int point[MAX][MAX], mark2[MAX][MAX];
bool dfs(int x, int y) {
  mark2[x][y] = 1;
  for (int i = 0; i < n; i++)
    if (x - i - 1 >= 0 && x + hh[i][0] - i - 1 + y + hh[i][1] <= r)
      if (mark2[x + hh[i][0] - i - 1][y + hh[i][1]] != 2) {
        if (mark2[x + hh[i][0] - i - 1][y + hh[i][1]] == 1) return false;
        if (mark2[x + hh[i][0] - i - 1][y + hh[i][1]] == 0)
          if (!dfs(x + hh[i][0] - i - 1, y + hh[i][1])) return false;
      }
  for (int i = 0; i < m; i++)
    if (y - i - 1 >= 0 && x + tt[i][0] + y + tt[i][1] - i - 1 <= r)
      if (mark2[x + tt[i][0]][y + tt[i][1] - i - 1] != 2) {
        if (mark2[x + tt[i][0]][y + tt[i][1] - i - 1] == 1) return false;
        if (mark2[x + tt[i][0]][y + tt[i][1] - i - 1] == 0)
          if (!dfs(x + tt[i][0], y + tt[i][1] - i - 1)) return false;
      }
  mark2[x][y] = 2;
  s t;
  t.x = x;
  t.y = y;
  ans.push_back(t);
  point[x][y] = ans.size() - 1;
  return true;
}
bool mark[MAX][MAX];
int bfs() {
  queue<s> q;
  s ss;
  ss.x = h;
  ss.y = t;
  ss.dis = 0;
  q.push(ss);
  mark[h][t] = true;
  while (q.size()) {
    s node = q.front();
    q.pop();
    if (node.x == 0 && node.y == 0) return node.dis;
    for (int i = 0; i < n; i++)
      if (node.x - i - 1 >= 0 &&
          node.x + hh[i][0] - i - 1 + node.y + hh[i][1] <= r)
        if (!mark[node.x + hh[i][0] - i - 1][node.y + hh[i][1]]) {
          mark[node.x + hh[i][0] - i - 1][node.y + hh[i][1]] = true;
          s t;
          t.x = node.x + hh[i][0] - i - 1;
          t.y = node.y + hh[i][1];
          t.dis = node.dis + 1;
          q.push(t);
        }
    for (int i = 0; i < m; i++)
      if (node.y - i - 1 >= 0 &&
          node.x + tt[i][0] + node.y + tt[i][1] - i - 1 <= r)
        if (!mark[node.x + tt[i][0]][node.y + tt[i][1] - i - 1]) {
          mark[node.x + tt[i][0]][node.y + tt[i][1] - i - 1] = true;
          s t;
          t.x = node.x + tt[i][0];
          t.y = node.y + tt[i][1] - i - 1;
          t.dis = node.dis + 1;
          q.push(t);
        }
  }
  return -1;
}
int dp[MAX2];
int main() {
  cin >> h >> t >> r;
  if (!h && !t) {
    cout << "Ivan";
    cout << 0;
    return 0;
  }
  cin >> n;
  for (int i = 0; i < n; i++) cin >> hh[i][0] >> hh[i][1];
  cin >> m;
  for (int i = 0; i < m; i++) cin >> tt[i][0] >> tt[i][1];
  int a = bfs();
  if (a > 0) {
    cout << "Ivan" << endl;
    cout << a;
    return 0;
  }
  if (!dfs(h, t)) {
    cout << "Draw";
    return 0;
  }
  int javab = -1;
  dp[ans.size() - 1] = 1;
  for (int j = ans.size() - 1; j >= 0; j--) {
    int x = ans[j].x, y = ans[j].y;
    for (int i = 0; i < n; i++)
      if (x - i - 1 >= 0 && x + hh[i][0] - i - 1 + y + hh[i][1] <= r)
        dp[point[x + hh[i][0] - i - 1][y + hh[i][1]]] =
            max(dp[j] + 1, dp[point[x + hh[i][0] - i - 1][y + hh[i][1]]]);
    for (int i = 0; i < m; i++)
      if (y - i - 1 >= 0 && x + tt[i][0] + y + tt[i][1] - i - 1 <= r)
        dp[point[x + tt[i][0]][y + tt[i][1] - i - 1]] =
            max(dp[j] + 1, dp[point[x + tt[i][0]][y + tt[i][1] - i - 1]]);
    javab = max(javab, dp[j]);
  }
  cout << "Zmey" << endl;
  cout << javab;
  return 0;
}
