6 6
 1 4
 4 4
 3 3
 6 4
 6 3
 5 4
 5 6
 3 4
 1 3
 3 2
 5 5
 1 1
 2 1
 3 1
 3 5
 1 6
 6 5
 2 3
 4 3
 2 2
 3 6
 1 2
 6 1
 2 5
 4 5
 1 5
 6 2
 4 6
 5 1
 4 1
 5 2
 2 4
 2 6
 5 3

1/6
 1/2
 1/2
 2/3
 1/6
 1/6
 1/3
 1/6
 1/2
 2/3
 2/3
 1/3
 1/1
 5/6
 2/3
 1/3
 1/6
 1/6
 2/3
 1/2
 5/6
 1/6
 5/6
 1/6
 1/3
 1/3
 1/3
 1/6
 1/6
 1/3
 1/2
 1/3
 1/2
 1/6
 1/3

#include <bits/stdc++.h>
using namespace std;
int bitct(long long r) { return r == 0 ? 0 : (bitct(r >> 1) + (r & 1)); }
long long gcd(long long x, long long y) { return x ? gcd(y % x, x) : y; }
template <typename T>
ostream& operator<<(ostream& o, vector<T> v) {
  o << "{";
  int i = 0, s = v.size();
  for (; i + 1 < s; i++) o << v[i] << ", ";
  if (s) o << v[i];
  o << "}";
  return o;
}
long long choose(long long n, long long q) {
  if (n == 0 || q == 0) return 1;
  if (q == 1)
    return n;
  else
    return (choose(n, q - 1) * (n - q + 1) / q);
}
vector<string> split(string& s, const string& d = " ") {
  vector<string> r;
  string t;
  for (int i = 0; i != s.size(); i++) {
    if (d.find(s[i]) != string::npos) {
      if (!t.empty()) {
        r.push_back(t);
        t = "";
      }
    } else {
      t += s[i];
    }
  }
  if (!t.empty()) {
    r.push_back(t);
  }
  return r;
}
vector<int> splitInt(string& s, const string& d = " ") {
  vector<string> t = split(s, d);
  vector<int> r;
  for (int i = 0; i != t.size(); i++) r.push_back(atoi(t[i].c_str()));
  return r;
}
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
int main() {
  int W, Y;
  cin >> W >> Y;
  int max = W > Y ? W : Y;
  switch (max) {
    case 1:
      cout << "1/1";
      break;
    case 2:
      cout << "5/6";
      break;
    case 3:
      cout << "2/3";
      break;
    case 4:
      cout << "1/2";
      break;
    case 5:
      cout << "1/3";
      break;
    case 6:
      cout << "1/6";
      break;
  }
  cout << endl;
  return 0;
}
