#include <bits/stdc++.h>
using namespace std;
template <typename T>
using Vec = vector<T>;
template <typename T>
using Matrix = Vec<Vec<T> >;
template <typename T>
using USet = unordered_set<T>;
template <typename T, class C>
using MyUSet = unordered_set<T, C>;
template <typename T, typename F>
using UMap = unordered_map<T, F>;
template <typename T, typename F, class C>
using MyUMap = unordered_map<T, F, C>;
class PiiHash {
 public:
  size_t operator()(const pair<int, int>& p) const {
    return (p.first << 16) | p.second;
  }
};
inline int POPCNT(int x) { return __builtin_popcount(x); }
inline int POPCNT(long long x) { return __builtin_popcount(x); }
const int iINF = 1L << 30;
const long long lINF = 1LL << 60;
const double EPS = 1e-9;
const double PI = acos(-1);
template <typename T>
inline bool in_range(T v, T mi, T mx) {
  return mi <= v && v < mx;
}
template <typename T>
inline bool in_range(T x, T y, T W, T H) {
  return in_range(x, 0, W) && in_range(y, 0, H);
}
const int DX[4] = {0, 1, 0, -1}, DY[4] = {-1, 0, 1, 0};
const int DX_[8] = {0, 1, 1, 1, 0, -1, -1, -1},
          DY_[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
template <typename T>
inline void modAdd(T& a, T b, T mod) {
  a = (a + b) % mod;
}
template <typename T>
inline void minUpdate(T& a, T b) {
  a = min(a, b);
}
template <typename T>
inline void maxUpdate(T& a, T b) {
  a = max(a, b);
}
template <typename F, typename T>
inline void convert(F& from, T& to) {
  stringstream ss;
  ss << from;
  ss >> to;
}
int main() {
  string X;
  cin >> X;
  int n = X.size(), ans = n, s = 0, t = 0;
  for (int i = (0); i < (n); ++i) {
    if (t == 0 && X[i] == 'S') {
      ++s;
    } else if (s > 0 && X[i] == 'T') {
      ++t;
    } else if (t > 0 && X[i] == 'S') {
      ans -= 2 * min(s, t);
      s = 1;
      t = 0;
    }
  }
  ans -= 2 * min(s, t);
  cout << ans << endl;
}
