#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
template <class T>
struct cplx {
  T x, y;
  cplx() {
    x = 0.0;
    y = 0.0;
  }
  cplx(T nx, T ny = 0) {
    x = nx;
    y = ny;
  }
  cplx operator+(const cplx &c) const { return {x + c.x, y + c.y}; }
  cplx operator-(const cplx &c) const { return {x - c.x, y - c.y}; }
  cplx operator*(const cplx &c) const {
    return {x * c.x - y * c.y, x * c.y + y * c.x};
  }
  cplx &operator*=(const cplx &c) {
    return *this = {x * c.x - y * c.y, x * c.y + y * c.x};
  }
  inline T real() const { return x; }
  inline T imag() const { return y; }
  template <class U>
  cplx operator*(const U &c) const {
    return {x * c, y * c};
  }
  template <class U>
  cplx operator/(const U &c) const {
    return {x / c, y / c};
  }
  template <class U>
  void operator/=(const U &c) {
    x /= c;
    y /= c;
  }
};
const int DIG = 9, FDIG = 3;
const int BASE = 1e9, FBASE = 1e3;
struct BigInt {
  int sgn;
  vector<int> a;
  BigInt() : sgn(1) {}
  BigInt(long long v) { *this = v; }
  BigInt &operator=(long long v) {
    sgn = 1;
    if (v < 0) sgn = -1, v = -v;
    a.clear();
    for (; v > 0; v /= BASE) a.push_back(v % BASE);
    return *this;
  }
  BigInt(const BigInt &other) {
    sgn = other.sgn;
    a = other.a;
  }
  friend void swap(BigInt &a, BigInt &b) {
    swap(a.sgn, b.sgn);
    swap(a.a, b.a);
  }
  BigInt &operator=(BigInt other) {
    swap(*this, other);
    return *this;
  }
  BigInt(BigInt &&other) : BigInt() { swap(*this, other); }
  BigInt(const string &s) { read(s); }
  void read(const string &s) {
    sgn = 1;
    a.clear();
    int k = 0;
    for (; k < s.size() && (s[k] == '-' || s[k] == '+'); k++)
      if (s[k] == '-') sgn = -sgn;
    for (int i = s.size() - 1; i >= k; i -= DIG) {
      int x = 0;
      for (int j = max(k, i - DIG + 1); j <= i; j++) x = x * 10 + s[j] - '0';
      a.push_back(x);
    }
    trim();
  }
  friend istream &operator>>(istream &in, BigInt &v) {
    string s;
    in >> s;
    v.read(s);
    return in;
  }
  friend ostream &operator<<(ostream &out, const BigInt &v) {
    if (v.sgn == -1 && !v.zero()) out << '-';
    out << (v.a.empty() ? 0 : v.a.back());
    for (int i = (int)v.a.size() - 2; i >= 0; --i)
      out << setw(DIG) << setfill('0') << v.a[i];
    return out;
  }
  bool operator<(const BigInt &v) const {
    if (sgn != v.sgn) return sgn < v.sgn;
    if (a.size() != v.a.size()) return a.size() * sgn < v.a.size() * v.sgn;
    for (int i = (int)a.size() - 1; i >= 0; i--)
      if (a[i] != v.a[i]) return a[i] * sgn < v.a[i] * sgn;
    return 0;
  }
  bool operator>(const BigInt &v) const { return v < *this; }
  bool operator<=(const BigInt &v) const { return !(v < *this); }
  bool operator>=(const BigInt &v) const { return !(*this < v); }
  bool operator==(const BigInt &v) const {
    return !(*this < v) && !(v < *this);
  }
  bool operator!=(const BigInt &v) const { return *this < v || v < *this; }
  friend int __cmp(const BigInt &x, const BigInt &y) {
    if (x.a.size() != y.a.size()) return x.a.size() < y.a.size() ? -1 : 1;
    for (int i = (int)x.a.size() - 1; i >= 0; --i)
      if (x.a[i] != y.a[i]) return x.a[i] < y.a[i] ? -1 : 1;
    return 0;
  }
  BigInt operator-() const {
    BigInt res = *this;
    if (zero()) return res;
    res.sgn = -sgn;
    return res;
  }
  void __add(const BigInt &v) {
    if (a.size() < v.a.size()) a.resize(v.a.size(), 0);
    for (int i = 0, carry = 0; i < max(a.size(), v.a.size()) || carry; ++i) {
      if (i == a.size()) a.push_back(0);
      a[i] += carry + (i < (int)v.a.size() ? v.a[i] : 0);
      carry = a[i] >= BASE;
      if (carry) a[i] -= BASE;
    }
  }
  void __sub(const BigInt &v) {
    for (int i = 0, carry = 0; i < (int)v.a.size() || carry; ++i) {
      a[i] -= carry + (i < (int)v.a.size() ? v.a[i] : 0);
      carry = a[i] < 0;
      if (carry) a[i] += BASE;
    }
    this->trim();
  }
  BigInt operator+=(const BigInt &v) {
    if (sgn == v.sgn)
      __add(v);
    else if (__cmp(*this, v) >= 0)
      __sub(v);
    else {
      BigInt vv = v;
      swap(*this, vv);
      __sub(vv);
    }
    return *this;
  }
  BigInt operator-=(const BigInt &v) {
    if (sgn == v.sgn) {
      if (__cmp(*this, v) >= 0)
        __sub(v);
      else {
        BigInt vv = v;
        swap(*this, vv);
        __sub(vv);
        sgn = -sgn;
      }
    } else
      __add(v);
    return *this;
  }
  template <typename L, typename R>
  typename enable_if<is_convertible<L, BigInt>::value &&
                         is_convertible<R, BigInt>::value &&
                         is_lvalue_reference<R &&>::value,
                     BigInt>::type friend
  operator+(L &&l, R &&r) {
    BigInt result(forward<L>(l));
    result += r;
    return result;
  }
  template <typename L, typename R>
  typename enable_if<is_convertible<L, BigInt>::value &&
                         is_convertible<R, BigInt>::value &&
                         is_rvalue_reference<R &&>::value,
                     BigInt>::type friend
  operator+(L &&l, R &&r) {
    BigInt result(move(r));
    result += l;
    return result;
  }
  template <typename L, typename R>
  typename enable_if<is_convertible<L, BigInt>::value &&
                         is_convertible<R, BigInt>::value,
                     BigInt>::type friend
  operator-(L &&l, R &&r) {
    BigInt result(forward<L>(l));
    result -= r;
    return result;
  }
  friend pair<BigInt, BigInt> divmod(const BigInt &a1, const BigInt &b1) {
    long long norm = BASE / (b1.a.back() + 1);
    BigInt a = a1.abs() * norm, b = b1.abs() * norm, q = 0, r = 0;
    q.a.resize(a.a.size());
    for (int i = a.a.size() - 1; i >= 0; i--) {
      r *= BASE;
      r += a.a[i];
      long long s1 = r.a.size() <= b.a.size() ? 0 : r.a[b.a.size()];
      long long s2 = r.a.size() <= b.a.size() - 1 ? 0 : r.a[b.a.size() - 1];
      long long d = ((long long)BASE * s1 + s2) / b.a.back();
      r -= b * d;
      while (r < 0) r += b, --d;
      q.a[i] = d;
    }
    q.sgn = a1.sgn * b1.sgn;
    r.sgn = a1.sgn;
    q.trim();
    r.trim();
    auto res = make_pair(q, r / norm);
    if (res.second < 0) res.second += b1;
    return res;
  }
  BigInt operator/(const BigInt &v) const { return divmod(*this, v).first; }
  BigInt operator%(const BigInt &v) const { return divmod(*this, v).second; }
  void operator/=(int v) {
    if (llabs(v) >= BASE) {
      *this /= BigInt(v);
      return;
    }
    if (v < 0) sgn = -sgn, v = -v;
    for (int i = (int)a.size() - 1, rem = 0; i >= 0; --i) {
      long long cur = a[i] + rem * (long long)BASE;
      a[i] = (int)(cur / v);
      rem = (int)(cur % v);
    }
    trim();
  }
  BigInt operator/(int v) const {
    if (llabs(v) >= BASE) return *this / BigInt(v);
    BigInt res = *this;
    res /= v;
    return res;
  }
  void operator/=(const BigInt &v) { *this = *this / v; }
  long long operator%(long long v) const {
    assert(v < BASE);
    int m = 0;
    for (int i = a.size() - 1; i >= 0; --i)
      m = (a[i] + m * (long long)BASE) % v;
    return m * sgn;
  }
  void operator*=(int v) {
    if (llabs(v) >= BASE) {
      *this *= BigInt(v);
      return;
    }
    if (v < 0) sgn = -sgn, v = -v;
    for (int i = 0, carry = 0; i < a.size() || carry; ++i) {
      if (i == a.size()) a.push_back(0);
      long long cur = a[i] * (long long)v + carry;
      carry = (int)(cur / BASE);
      a[i] = (int)(cur % BASE);
    }
    trim();
  }
  BigInt operator*(int v) const {
    if (llabs(v) >= BASE) return *this * BigInt(v);
    BigInt res = *this;
    res *= v;
    return res;
  }
  static vector<int> convert_base(const vector<int> &a, int old_digits,
                                  int new_digits) {
    vector<long long> p(max(old_digits, new_digits) + 1);
    p[0] = 1;
    for (int i = 1; i < (int)p.size(); i++) p[i] = p[i - 1] * 10;
    vector<int> res;
    long long cur = 0;
    int cur_digits = 0;
    for (int i = 0; i < (int)a.size(); i++) {
      cur += a[i] * p[cur_digits];
      cur_digits += old_digits;
      while (cur_digits >= new_digits) {
        res.push_back((long long)(cur % p[new_digits]));
        cur /= p[new_digits];
        cur_digits -= new_digits;
      }
    }
    res.push_back((int)cur);
    while (!res.empty() && !res.back()) res.pop_back();
    return res;
  }
  void fft(vector<cplx<long double> > &a, bool invert) const {
    int n = a.size();
    for (int i = 1, j = 0; i < n; ++i) {
      int bit = n / 2;
      for (; j >= bit; bit /= 2) j -= bit;
      j += bit;
      if (i < j) swap(a[i], a[j]);
    }
    for (int len = 2; len <= n; len *= 2) {
      long double ang = 2 * 3.14159265358979323846L / len * (invert ? -1 : 1);
      cplx<long double> wlen(cos(ang), sin(ang));
      for (int i = 0; i < n; i += len) {
        cplx<long double> w(1);
        for (int j = 0; j < len / 2; ++j) {
          cplx<long double> u = a[i + j], v = a[i + j + len / 2] * w;
          a[i + j] = u + v;
          a[i + j + len / 2] = u - v;
          w *= wlen;
        }
      }
    }
    if (invert)
      for (int i = 0; i < n; ++i) a[i] /= n;
  }
  void multiply_fft(const vector<int> &a, const vector<int> &b,
                    vector<int> &res) const {
    vector<cplx<long double> > fa(a.begin(), a.end()), fb(b.begin(), b.end());
    int n = 1;
    while (n < max(a.size(), b.size())) n *= 2;
    n *= 2;
    fa.resize(n);
    fb.resize(n);
    fft(fa, 0);
    fft(fb, 0);
    for (int i = 0; i < n; ++i) fa[i] *= fb[i];
    fft(fa, 1);
    res.resize(n);
    long long carry = 0;
    for (int i = 0; i < n; i++) {
      long long t = (long long)(fa[i].real() + 0.5) + carry;
      carry = t / FBASE;
      res[i] = t % FBASE;
    }
  }
  BigInt mul_simple(const BigInt &v) const {
    BigInt res;
    res.sgn = sgn * v.sgn;
    res.a.resize(a.size() + v.a.size());
    for (int i = 0; i < a.size(); i++)
      if (a[i])
        for (int j = 0, carry = 0; j < v.a.size() || carry; j++) {
          long long cur = res.a[i + j] +
                          (long long)a[i] * (j < v.a.size() ? v.a[j] : 0) +
                          carry;
          carry = (int)(cur / BASE);
          res.a[i + j] = (int)(cur % BASE);
        }
    res.trim();
    return res;
  }
  BigInt mul_fft(const BigInt &v) const {
    BigInt res;
    multiply_fft(convert_base(a, DIG, FDIG), convert_base(v.a, DIG, FDIG),
                 res.a);
    res.a = convert_base(res.a, FDIG, DIG);
    res.trim();
    return res;
  }
  void operator*=(const BigInt &v) { *this = *this * v; }
  BigInt operator*(const BigInt &v) const {
    if (a.size() * v.a.size() <= 100111) return mul_simple(v);
    return mul_fft(v);
  }
  BigInt abs() const {
    BigInt res = *this;
    res.sgn *= res.sgn;
    return res;
  }
  void trim() {
    while (!a.empty() && !a.back()) a.pop_back();
  }
  bool zero() const { return a.empty() || (a.size() == 1 && !a[0]); }
  friend BigInt gcd(const BigInt &a, const BigInt &b) {
    return b.zero() ? a : gcd(b, a % b);
  }
};
const int N = 1.7e5;
BigInt pow(int b, int e) {
  BigInt ans = 1, cur = b;
  ans.a.reserve(N);
  cur.a.reserve(N);
  int i = 0;
  while (e) {
    if (e % 2) ans *= cur;
    cur *= cur;
    e /= 2;
  }
  return ans;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  string s;
  cin >> s;
  BigInt n = BigInt(s);
  int e = s.size() / log10(3);
  BigInt k = pow(3, max(0, e - 6));
  long long ans = 3 * max(0, e - 6);
  while (k < n) {
    if (k * 2 >= n) {
      ans += 2;
      break;
    }
    if (k * 4 >= n && k * 3 < n) {
      ans += 4;
      break;
    }
    k *= 3;
    ans += 3;
  }
  cout << max(1LL, ans) << '\n';
  return 0;
}
