#include <bits/stdc++.h>   using namespace std;   template <typename T>   T gcd(T first, T second) {     while (second > 0) {       first %= second;       swap(first, second);     }     return first;   }   template <class T>   T lcm(T a, T b) {     return a / gcd(a, b) * b;   }   template <class _T>   inline _T sqr(const _T &first) {     return first * first;   }   template <class _T>   inline string tostr(const _T &a) {     ostringstream os(  );     os << a;     return os.str();   }   const long double PI = 3.1415926535897932384626433832795L;   template <typename T>   inline void input(T &a) {     static int ed;     a = 0;     while (!isdigit(ed = getchar()) && ed !=  - ) {     }     char neg = 0;     if (ed ==  - ) {       neg = 1;       ed = getchar();     }     while (isdigit(ed)) {       a = 10 * a + ed -  0 ;       ed = getchar();     }     if (neg) a = -a;   }   template <typename T = int>   inline T nxt() {     T res;     input(res);     return res;   }   mt19937 generator;   bool check(int v) {     if (v < 2) return false;     for (int i = 2; i * i <= v; ++i) {       if (v % i == 0) {         return false;       }     }     return true;   }   long long pw(long long a, long long n, long long m) {     long long res = 1;     while (n) {       if (n & 1ll) {         res = res * a % m;       }       a = a * a % m;       n >>= 1;     }     return res;   }   long long bin[5][5];   void pre() {     for (int i = 0; i < 5; ++i) {       bin[i][0] = 1;       for (int j = 1; j <= i; ++j) {         bin[i][j] = bin[i - 1][j] + bin[i - 1][j - 1];       }     }   }   void read() {}   void test() {}   long long mod = 1000000007;   vector<int> g[1 << 20];   int dp[1 << 20];   int solve(int v) {     int &res = dp[v];     if (res != -1) {       return res;     }     res = 1;     for (int to : g[v]) {       if (to < v) {         res = max(res, solve(to) + 1);       }     }     return res;   }   void solve() {     int n = nxt();     int m = nxt();     for (int i = 0; i < m; ++i) {       int u = nxt() - 1;       int v = nxt() - 1;       g[u].push_back(v);       g[v].push_back(u);     }     memset(dp, 255, sizeof(dp));     long long ans = 0;     for (int i = 0; i < n; ++i) {       ans = max(ans, 1ll * solve(i) * (int)g[i].size());     }     cout << ans << endl;   }   void solve2() {}   int main() {     int t = 1;     pre();     while (t--) {       read();       solve();     }     return 0;   }   