#include <bits/stdc++.h>
using namespace std;
int top(int a, int b) {
  if (a % b == 0)
    return a / b;
  else
    return a / b + 1;
}
long long mod(long long x) {
  if (x >= 1000000007)
    return x - 1000000007;
  else
    return x;
}
long long binpow(long long a, long long n) {
  if (n == 0) return 1;
  if (n % 2 == 1)
    return (binpow(a, n - 1) * a);
  else {
    long long b = (binpow(a, n / 2));
    return (b * b);
  }
}
struct point {
  long long x, y;
};
struct otr {
  point s, f;
};
vector<long long> t;
void build(vector<long long> a, int v, int tl, int tr) {
  if (tl == tr)
    t[v] = a[tl];
  else {
    int tm = (tl + tr) / 2;
    build(a, v * 2, tl, tm);
    build(a, v * 2 + 1, tm + 1, tr);
    t[v] = t[v * 2] + t[v * 2 + 1];
  }
}
long long sum(int v, int tl, int tr, int l, int r) {
  if (l > r) return 0;
  if (l == tl && r == tr) return t[v];
  int tm = (tl + tr) / 2;
  return sum(v * 2, tl, tm, l, min(r, tm)) +
         sum(v * 2 + 1, tm + 1, tr, max(l, tm + 1), r);
}
void update(int v, int tl, int tr, int pos, int new_val) {
  if (tl == tr)
    t[v] = new_val;
  else {
    int tm = (tl + tr) / 2;
    if (pos <= tm)
      update(v * 2, tl, tm, pos, new_val);
    else
      update(v * 2 + 1, tm + 1, tr, pos, new_val);
    t[v] = t[v * 2] + t[v * 2 + 1];
  }
}
struct fruct {
  int x, y, k;
};
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  string s;
  cin >> s;
  int slen = s.length();
  int a = top(slen, 20), b = top(slen, a);
  cout << a << " " << b << "\n";
  int kz = a * b - slen;
  int y = 0;
  for (int i = 0; i < a; i++) {
    for (int j = 0; j < b - 1; j++) {
      cout << s[y];
      y++;
    }
    if (kz != 0) {
      cout << "*\n";
      kz--;
    } else {
      cout << s[y] << "\n";
      y++;
    }
  }
  return 0;
}
