#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:268435456")
using namespace std;
template <typename T>
T sqr(const T &x) {
  return x * x;
}
template <typename T>
T my_abs(const T &x) {
  return x < 0 ? -x : x;
}
const int INF = (int)1e9;
const long long LINF = (long long)6e18;
const long long INF64 = LINF;
const long long INFLL = LINF;
const long double EPS = 1e-8;
const long double PI = 3.1415926535897932384626433832795;
const long double ME = 1e-5;
const long long MOD = (int)1e9 + 7;
const long long MOD2 = (int)1e9 + 21;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
const int SQN = 400;
const int LOGN = 20;
const int N = (int)1e5 + 10;
const int M = (int)1e5 + 10;
map<string, int> hosts;
map<string, int> paths;
map<int, set<int>> nums;
string oh[N];
char buf[100];
pair<vector<int>, int> a[N];
void solve() {
  int n;
  scanf("%d\n", &n);
  int idx_host = 0, idx_path = 0;
  for (int i = 0; i < int(n); ++i) {
    scanf("%s\n", buf);
    string s = string(buf);
    string h = "";
    int cnt = 0;
    int pos = 0;
    while (pos < int(s.size())) {
      if (s[pos] == '/') {
        cnt++;
      }
      if (cnt == 3) {
        break;
      }
      h.push_back(s[pos++]);
    }
    string p = "";
    while (pos < int(s.size())) {
      p.push_back(s[pos++]);
    }
    if (!hosts.count(h)) {
      oh[idx_host] = h;
      hosts[h] = idx_host++;
    }
    if (!paths.count(p)) {
      paths[p] = idx_path++;
    }
    nums[hosts[h]].insert(paths[p]);
  }
  int idx = 0;
  for (auto it = nums.begin(); it != nums.end(); ++it) {
    a[idx].first.resize(int(it->second.size()));
    a[idx].second = it->first;
    int pos = 0;
    for (auto i = it->second.begin(); i != it->second.end(); ++i) {
      a[idx].first[pos++] = *i;
    }
    idx++;
  }
  sort(a, a + idx);
  vector<vector<int>> ans;
  ans.push_back(vector<int>());
  for (int i = 1; i < int(idx); ++i) {
    bool ok = true;
    if (int(a[i].first.size()) != int(a[i - 1].first.size())) {
      ok = false;
    } else {
      for (int j = 0; j < int(int(a[i].first.size())); ++j) {
        if (a[i].first[j] != a[i - 1].first[j]) {
          ok = false;
          break;
        }
      }
    }
    if (ok) {
      if (int(ans.back().size()) == 0) {
        ans.back().push_back(a[i - 1].second);
      }
      ans.back().push_back(a[i].second);
    } else {
      if (int(ans.back().size()) != 0) {
        ans.push_back(vector<int>());
      }
    }
  }
  if (int(ans.back().size()) == 0) {
    ans.pop_back();
  }
  printf("%d\n", ans.size());
  for (int i = 0; i < int(int(ans.size())); ++i) {
    for (int j = 0; j < int(int(ans[i].size())); ++j) {
      printf("%s ", oh[ans[i][j]].c_str());
    }
    printf("\n");
  }
}
int main() {
  srand((unsigned int)time(NULL));
  cout << setprecision(10) << fixed;
  solve();
  return 0;
}
