#include <bits/stdc++.h>
using namespace std;
const long double epsilon = 1e-9;
int mat[512][512];
bool vis[512][512];
bool vis2[512][512];
int father[512][512][2];
int idx[512][512];
int heads[256][2];
int tails[256][2];
int depth[256][256];
int main() {
  memset(mat, -1, sizeof(mat));
  memset(vis, false, sizeof(vis));
  memset(vis2, false, sizeof(vis2));
  memset(depth, 0, sizeof(depth));
  int h, r, t;
  cin >> h >> t >> r;
  mat[h][t] = 0;
  if (h + t == 0) {
    cout << "Ivan" << endl;
    cout << 0 << endl;
    return 0;
  }
  if (h + t > r) {
    cout << "Zmey" << endl;
    cout << 0 << endl;
    return 0;
  }
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    scanf("%d", &heads[i][0]);
    scanf("%d", &heads[i][1]);
  }
  int m;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    scanf("%d", &tails[i][0]);
    scanf("%d", &tails[i][1]);
  }
  for (int i = 0; i < 256; i++)
    for (int j = 0; j < 256; j++) idx[i][j] = 1;
  queue<pair<int, int> > toProcess;
  pair<int, int> cur;
  toProcess.push(make_pair(h, t));
  int lim;
  int x, y;
  int maxm = 0;
  while (!toProcess.empty()) {
    cur = toProcess.front();
    toProcess.pop();
    lim = min(n, cur.first);
    for (int i = 1; i <= lim; i++) {
      x = cur.first - i + heads[i][0];
      y = cur.second + heads[i][1];
      if (x + y == 0) {
        cout << "Ivan" << endl;
        cout << mat[cur.first][cur.second] + 1 << endl;
        return 0;
      }
      if (x + y > r) {
        maxm = max(maxm, mat[cur.first][cur.second] + 1);
      } else if (mat[x][y] == -1) {
        mat[x][y] = mat[cur.first][cur.second] + 1;
        toProcess.push(make_pair(x, y));
      }
    }
    lim = min(m, cur.second);
    for (int i = 1; i <= lim; i++) {
      x = cur.first + tails[i][0];
      y = cur.second - i + tails[i][1];
      if (x + y == 0) {
        cout << "Ivan" << endl;
        cout << mat[cur.first][cur.second] + 1 << endl;
        return 0;
      }
      if (x + y > r) {
        maxm = max(maxm, mat[cur.first][cur.second] + 1);
      } else if (mat[x][y] == -1) {
        mat[x][y] = mat[cur.first][cur.second] + 1;
        toProcess.push(make_pair(x, y));
      }
    }
  }
  stack<pair<int, int> > stek;
  stek.push(make_pair(h, t));
  vis[h][t] = true;
  vis2[h][t] = true;
  int beg;
  int off;
  while (!stek.empty()) {
    cur = stek.top();
    lim = min(n, cur.first);
    bool pushed = false;
    for (int i = idx[cur.first][cur.second]; i <= lim; i++) {
      x = cur.first - i + heads[i][0];
      y = cur.second + heads[i][1];
      if (x + y > r) {
        depth[cur.first][cur.second] = max(depth[cur.first][cur.second], 1);
        maxm = max(maxm, depth[cur.first][cur.second]);
        continue;
      }
      if (vis[x][y]) {
        cout << "Draw" << endl;
        return 0;
      }
      if (!vis2[x][y]) {
        vis2[x][y] = true;
        vis[x][y] = true;
        father[x][y][0] = cur.first;
        father[x][y][1] = cur.second;
        idx[cur.first][cur.second] = i + 1;
        stek.push(make_pair(x, y));
        pushed = true;
        break;
      } else {
        depth[cur.first][cur.second] =
            max(depth[x][y] + 1, depth[cur.first][cur.second]);
        maxm = max(maxm, depth[cur.first][cur.second]);
      }
    }
    if (pushed) continue;
    off = lim;
    if (idx[cur.first][cur.second] > off)
      beg = idx[cur.first][cur.second] - off;
    else
      beg = 1;
    lim = min(m, cur.second);
    for (int i = beg; i <= lim; i++) {
      x = cur.first + tails[i][0];
      y = cur.second - i + tails[i][1];
      if (x + y > r) {
        depth[cur.first][cur.second] = max(depth[cur.first][cur.second], 1);
        maxm = max(maxm, depth[cur.first][cur.second]);
        continue;
      }
      if (vis[x][y]) {
        cout << "Draw" << endl;
        return 0;
      }
      if (!vis2[x][y]) {
        vis2[x][y] = true;
        vis[x][y] = true;
        father[x][y][0] = cur.first;
        father[x][y][1] = cur.second;
        idx[cur.first][cur.second] = i + 1 + off;
        stek.push(make_pair(x, y));
        pushed = true;
        break;
      } else {
        depth[cur.first][cur.second] =
            max(depth[x][y] + 1, depth[cur.first][cur.second]);
        maxm = max(maxm, depth[cur.first][cur.second]);
      }
    }
    if (!pushed) {
      stek.pop();
      if (stek.empty()) break;
      x = father[cur.first][cur.second][0];
      y = father[cur.first][cur.second][1];
      depth[x][y] = max(depth[x][y], depth[cur.first][cur.second] + 1);
      maxm = max(maxm, depth[x][y]);
      vis[cur.first][cur.second] = false;
    }
  }
  maxm = max(maxm, depth[h][t]);
  cout << "Zmey" << endl;
  cout << maxm << endl;
  return 0;
}
