#include <bits/stdc++.h>
using namespace std;
int n, m, R;
vector<pair<int, int> > H;
vector<pair<int, int> > T;
vector<pair<int, int> > edges(pair<int, int> a) {
  int nx = min(a.first, n), mx = min(a.second, m);
  vector<pair<int, int> > res;
  for (int _n((nx)-1), i(0); i <= _n; i++)
    res.push_back(
        make_pair(a.first - (i + 1) + H[i].first, a.second + H[i].second));
  for (int _n((mx)-1), i(0); i <= _n; i++)
    res.push_back(
        make_pair(a.first + T[i].first, a.second - (i + 1) + T[i].second));
  return res;
}
int used[400][400];
int df[400][400];
int tryWin(pair<int, int> cur) {
  for (int _n((400) - 1), i(0); i <= _n; i++)
    for (int _n((400) - 1), j(0); j <= _n; j++) df[i][j] = 1000000000;
  queue<pair<int, int> > Q;
  Q.push(cur);
  df[cur.first][cur.second] = 0;
  while (!Q.empty()) {
    pair<int, int> c = Q.front();
    Q.pop();
    if (c.first == 0 && c.second == 0) return df[0][0];
    vector<pair<int, int> > E = edges(c);
    for (int _n(((int)((E).end() - (E).begin())) - 1), i(0); i <= _n; i++)
      if (E[i].first + E[i].second <= R &&
          df[E[i].first][E[i].second] == 1000000000) {
        df[E[i].first][E[i].second] = df[c.first][c.second] + 1;
        Q.push(E[i]);
      }
  }
  return df[0][0];
}
bool tryDraw(pair<int, int> cur) {
  if (used[cur.first][cur.second] == 2) return false;
  if (used[cur.first][cur.second] == 1) return true;
  if (cur.first + cur.second > R) return false;
  used[cur.first][cur.second] = 1;
  vector<pair<int, int> > E = edges(cur);
  for (int _n(((int)((E).end() - (E).begin())) - 1), i(0); i <= _n; i++)
    if (tryDraw(E[i])) return true;
  used[cur.first][cur.second] = 2;
  return false;
}
int tryLose(pair<int, int> cur) {
  if (used[cur.first][cur.second]) return df[cur.first][cur.second];
  if (cur.first + cur.second > R) return 0;
  vector<pair<int, int> > E = edges(cur);
  int mx = 0;
  for (int _n(((int)((E).end() - (E).begin())) - 1), i(0); i <= _n; i++)
    mx = max(mx, tryLose(E[i]));
  mx++;
  used[cur.first][cur.second] = true;
  return df[cur.first][cur.second] = mx;
}
int main() {
  int h, t;
  scanf("%d%d%d", &h, &t, &R);
  scanf("%d", &n);
  H.resize(n);
  for (int _n((n)-1), i(0); i <= _n; i++)
    scanf("%d%d", &H[i].first, &H[i].second);
  scanf("%d", &m);
  T.resize(m);
  for (int _n((m)-1), i(0); i <= _n; i++)
    scanf("%d%d", &T[i].first, &T[i].second);
  memset((used), 0, sizeof(used));
  int c = tryWin(make_pair(h, t));
  if (c < 1000000000) {
    cout << "Ivan" << endl;
    cout << c << endl;
    return 0;
  }
  memset((used), 0, sizeof(used));
  bool d = tryDraw(make_pair(h, t));
  if (d) {
    cout << "Draw" << endl;
    return 0;
  }
  memset((used), 0, sizeof(used));
  int l = tryLose(make_pair(h, t));
  cout << "Zmey" << endl;
  cout << l << endl;
  return 0;
}
