#include <bits/stdc++.h>
using namespace std;
int n,m,si[200010];
struct node{
int x,y;
}a[400010];
vector<int>v[200010];
bool cmp(node x,node y){
if(x.x<y.x)
return true;
if(x.x==y.x)
return x.y<y.y;
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>a[i].x>>a[i].y;
for(int i=1;i<=m;i++)
v[a[i].x].push_back(a[i].y),v[a[i].y].push_back(a[i].x);
for(int i=1;i<=n;i++){
si[i]=1;
for(int j=0;j<v[i].size();j++)
if(v[i][j]<i)
si[i]=max(si[v[i][j]]+1,si[i]);
}
long long ans=0;
for(int i=1;i<=n;i++){
long long tmp=v[i].size();
ans=max(ans,si[i]*tmp);
}
cout<<ans;
return 0;
}
/*
┏┓ ┏┓
┏┛┻━━━┛┻┓
┃ ┃
┃ ━ ┃
┃ ┳┛ ┗┳ ┃
┃ ┃
┃ ┻ ┃
┃ ┃
┗━┓ ┏━┛Codes are far away from bugs with the animal protecting
┃ ┃ 神兽保佑,代码无bug
┃ ┃
┃ ┗━━━┓
┃ ┣┓
┃ ┏┛
┗┓┓┏━┳┓┏┛
┃┫┫ ┃┫┫
┗┻┛ ┗┻┛ ○| ̄|_
*/
#include <bits/stdc++.h>
using namespace std;
int n,m,si[200010],x,y;
vector<int>v[200010];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
v[x].push_back(y),v[y].push_back(x);
}
for(int i=1;i<=n;i++){
si[i]=1;
for(int j=0;j<v[i].size();j++)
if(v[i][j]<i)
si[i]=max(si[v[i][j]]+1,si[i]);
}
long long ans=0;
for(int i=1;i<=n;i++){
long long tmp=v[i].size();
ans=max(ans,si[i]*tmp);
}
cout<<ans;
return 0;
}
/*
┏┓ ┏┓
┏┛┻━━━┛┻┓
┃ ┃
┃ ━ ┃
┃ ┳┛ ┗┳ ┃
┃ ┃
┃ ┻ ┃
┃ ┃
┗━┓ ┏━┛Codes are far away from bugs with the animal protecting
┃ ┃ 神兽保佑,代码无bug
┃ ┃
┃ ┗━━━┓
┃ ┣┓
┃ ┏┛
┗┓┓┏━┳┓┏┛
┃┫┫ ┃┫┫
┗┻┛ ┗┻┛ ○| ̄|_
*/
第一份代码比第二份多了一次for循环为什么反而更快(C++14,开O2